質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

1回答

16829閲覧

WindowsフォームアプリからサーバへのWindows認証実装方法について

yukidaruma.

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

3クリップ

投稿2018/10/17 13:15

編集2022/01/12 10:55

前提・実現したいこと

WindowsフォームアプリからWindows Server(Webサービス)への認証にWindows認証を使用しようと考えており、その実装方法とローカルPCでの検証方法についてご教示いただきたいです。
ローカルPCでの検証については検証用のサーバが準備できていないため事前に検証をしたく思っているのですが、Active Directoryが無いためできないのかなと考えています。
不足情報等ございましたらご指摘ください。宜しくお願いします。

試したこと

Webサービスを呼び出す - asmx SOAP Webサービスの呼び出し (C#プログラミング)

上記サイトを参考にローカル環境でWebサービスおよびWindowsフォームアプリを作成してみましたが、例の通りだと匿名アクセスのため上手くいきますが、IISの設定をWindows認証に設定するとエラーが発生してしまいました。

[IISの設定変更箇所]
Default Web Site内に作成した当該アプリケーションに対し[機能ビュー]から[認証]を開き、「Windows認証」のみ有効化し、その他は無効化しました。

▼エラー内容

System.ServiceModel.Security.MessageSecurityException: 'この HTTP 要求は、クライアントの認証方式 'Anonymous' では承認されません。サーバーから受信した認証ヘッダーは 'Negotiate,NTLM' でした。' 内部例外 WebException: リモート サーバーがエラーを返しました: (401) 許可されていません

▼Webサービス(自動生成されたコメント部を省いています)

C#

1[WebService(Namespace = "http://localhost")] 2[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 3[System.ComponentModel.ToolboxItem(false)] 4public class SimpleWebService : System.Web.Services.WebService { 5 [WebMethod] 6 public string HelloWorld() { 7 return "Hello World"; 8 } 9}

▼Windowsフォームアプリ

C#

1private void button1_Click(object sender, EventArgs e) { 2 SimpleWebServiceReference.SimpleWebServiceSoapClient cl = new SimpleWebServiceReference.SimpleWebServiceSoapClient(); 3 string value = cl.HelloWorld(); // ここでエラー発生 4 textBox1.Text = value; 5}

ブラウザからWebサービスにアクセスした場合は以下の通り表示されます。
イメージ説明

IISの設定は以下の通りです。
イメージ説明

補足情報(FW/ツールのバージョンなど)

Windowsフォームアプリ → Webサービス → SQL Serverという構成を想定しており、Webサービス、SQL Server、Active Directoryは同サーバ内に構築予定です。

■クライアントOS:Windows7
■サーバ:Windows Server(バージョン未定)
■DB:SQL Server 2017
■開発ツール:Visual Studio Professional 2017
■言語:C#

[追記]回答に対して試したこと

クレデンシャルを送る処理を追加しましたが同様の箇所でエラーが発生してしまいました。エラーメッセージは"Anonymous"の部分が"Negotiate"に変わりました。

▼Windowsフォームアプリ

C#

1 private void button1_Click(object sender, EventArgs e) { 2 System.ServiceModel.BasicHttpBinding MyHttpBinding = new System.ServiceModel.BasicHttpBinding(System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly); 3 MyHttpBinding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows; 4 System.ServiceModel.EndpointAddress MyAuthASMXWebServiceAddress = new System.ServiceModel.EndpointAddress(new Uri("http://localhost/SimpleAsmxWebService/SimpleWebService.asmx")); 5 SimpleWebServiceReference.SimpleWebServiceSoapClient cl = new SimpleWebServiceReference.SimpleWebServiceSoapClient(MyHttpBinding, MyAuthASMXWebServiceAddress); 6 cl.ClientCredentials.Windows.ClientCredential.Domain = "localhost"; 7 cl.ClientCredentials.Windows.ClientCredential.UserName = "username"; 8 cl.ClientCredentials.Windows.ClientCredential.Password = "password"; 9 10 string value = cl.HelloWorld(); // ここでエラー発生 11 textBox1.Text = value; 12 }

▼エラー内容

System.ServiceModel.Security.MessageSecurityException: 'この HTTP 要求は、クライアントの認証方式 'Negotiate' では承認されません。サーバーから受信した認証ヘッダーは 'Negotiate,NTLM' でした。' 内部例外 WebException: リモート サーバーがエラーを返しました: (401) 許可されていません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/18 01:12

今回の話は、Active Driectory ドメイン環境という最終的な運用環境ではなく、開発環境すなわち開発マシンのローカル IIS または IIS Express 上の ASP.NET Web Service と Windows Forms アプリの話で、当然 Active Directory とかは関係ないという状況ですか?
退会済みユーザー

退会済みユーザー

2018/10/18 01:18 編集

エラーメッセージをそのままコピーして質問に書いてください。あと、IIS の設定とかありますが具体的にどうやったのか、エラーはどのような手順で作業してどのタイミングで発生するのかも質問に書いてください。
退会済みユーザー

退会済みユーザー

2018/10/18 01:21

もう一つ、ブラウザから問題の Web サービスにアクセスするとどうなりますか?
yukidaruma.

2018/10/18 12:38

>SurferOnWww様 前提として最終的な運用環境という意味でADについて記載しましたが、仰る通り、現状困っているのはローカル環境に閉じた話なのでADは関係ない認識で合っています。
退会済みユーザー

退会済みユーザー

2018/10/19 01:37

> 現状困っているのはローカル環境に閉じた話なのでADは関係ない認識で合っています。 ← であれば Active Directory, Windows Server のタグは外していただくようお願いします。SQL Server も関係ないので外してください。また、ASP.NET のタグを付けてください。
退会済みユーザー

退会済みユーザー

2018/10/19 01:43

最終的な運用環境での話、例えば「Active Driectory ドメイン環境でドメインに属する Windows 認証を要求する Web サーバーの Web サービスに、ドメインユーザーが Windows Forms アプリでアクセスして、シングルサインオンは有効か?」という質問があれば、新たに別のスレッドで質問されることをお勧めします。
yukidaruma.

2018/10/19 23:58

タグの件、ご指摘ありがとうございます。対応いたしました。また、運用環境での件についても確かに切り分けて質問させていただいた方が良さそうですね。不慣れなもので恐縮です。
guest

回答1

0

ブラウザからWebサービスにアクセスした場合は以下の通り表示されます。

ユーザー情報を入力するダイアログが表示されませんか? ダイアログが出ないとすると何か変なのですが(匿名認証が有効になっているとか?)、とりあえずそれはちょっと置いといて・・・

アップされた「Windowsフォームアプリ」を見るとクレデンシャルが送られてないですよね。

以下の記事の「Windows ストア アプリケーションから Windows 認証を用いて ASMX Web Service を取り込む」のセクションのように、クレデンシャルを送らないとダメだと思います。

助けて下さい! ASMX Web サービスに接続するにはどうしたらいいのですか?
https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2013/12/09/asmx-web-123/

分からないことがあれば聞いてください。

【追記】

下の 2018/10/20 10:15 の私のコメントで「後で自分がどのようにしたかもう少し詳しい情報を書きます」と書きましたが、それを以下に追記します。

まず開発環境ですが以下の通りです。

Web サービス
・Windows 10 Pro 64-bit
・Visual Studio Pro 2010
・ASP.NET Web サイト(注:テンプレートは「空」ではない)
・.NET 4
・ローカル IIS10 (Default Web Site 下のアプリケーションとして設定)
・SSL 使用せず
・IE11

Windows Forms アプリ
・Windows 10 Pro 64-bit
・Visual Studio Community 2015
・.NET 4.6.1

質問者さんが参考にされている記事とほぼ同じ手順で HelloWorld のみの Web サービスを追加し、質問者さんが行ったように IIS Manager で Windows 認証を有効にし匿名認証ほか他はすべて無効に設定します。

IE11 を立ち上げて、アドレスバーに上記で追加した Web サービスの URL を張り付けて要求をかけると、以下の認証情報を要求するダイアログが表示されます。(Windows 認証は IE と IIS で実現されている機能です。必ず IE を使ってください)

イメージ説明

PC を立ち上げる時ログインに使っている自分のアカウント名とパスワードを入力して[OK]ボタンをクリックすれば、質問者さんが筆問にアップされた画像と同じものが表示されます。

イメージ説明

HelloWorld をクリックしていって期待通りの応答が返ってくることを確認後、上の画像の認証ダイアログで使ったのと同じコンピュータ名、アカウント名、パスワードをそれぞれ以下のように Domain、UserName、Password に設定します。

private void button1_Click(object sender, EventArgs e) { System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding( System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly); binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows; System.ServiceModel.EndpointAddress address = new System.ServiceModel.EndpointAddress( new Uri("http://localhost/WindowsAuthntication/WebService.asmx")); ServiceReference1.WebServiceSoapClient proxy = new ServiceReference1.WebServiceSoapClient(binding, address); proxy.ClientCredentials.Windows.ClientCredential.Domain = "MyComputer"; proxy.ClientCredentials.Windows.ClientCredential.UserName = "surfe"; proxy.ClientCredentials.Windows.ClientCredential.Password = "*****************"; string value = proxy.HelloWorld(); label1.Text = value; }

以上で Windows Forms アプリからも認証は通るようになり、Web サービスから期待した応答が返ってきます。

ちなみに、Domain, UserName, Password の設定なしの場合、現在のユーザーのクレデンシャルが自動的に使われるようで(想像です)、認証が通るという結果になりました。ご参考まで。

質問者さんのケースでは、IE でアクセスした場合の認証ダイアログが出ないとのことですが、そのあたりの理由は分かりません。

投稿2018/10/18 14:28

編集2018/10/21 03:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukidaruma.

2018/10/20 00:24

ご回答ありがとうございます。 掲載いただいたサイトを参考にクレデンシャルを送る処理を追加しましたが、同様の箇所でエラーが発生してしまいました。対応内容は「回答に対して試したこと」として質問内容に追記しました。 Webブラウザからアクセスした場合ですが、ダイアログは表示されずに直接添付した画像のページが表示されます。IISの設定内容について「試したこと」に追記しました。 恐れ入りますが、引き続きよろしくお願い致します。
退会済みユーザー

退会済みユーザー

2018/10/20 01:15

> Webブラウザからアクセスした場合ですが、ダイアログは表示されずに直接添付した画像のページが表示されます。 そこが解せないですね。IE でアクセスすると必ず認証情報を要求するダイアログが出るはずなのですが。後で自分がどのようにしたかもう少し詳しい情報を書きます。今から外出するので夜遅く又は明日になりますが。
yukidaruma.

2018/10/20 09:32

既にWindowsにログインしている状態だからダイアログが出ないのかと思っていました。 お時間割いていただき申し訳ありません。こちらも動作確認できるのが月曜出社してからになりますので、急ぎでなくて大丈夫です。
yukidaruma.

2018/10/22 12:34

検証手順等ご丁寧に記載いただきありがとうございます。 IISの設定等見直してみましたがやはりIE11からアクセスした場合のダイアログは表示されません。プログラムについてもエラーが解消されていない状況です。 ダイアログが表示されない点から考えると、設定周りや環境に問題がありそうですね。引き続き調査し、進展がありましたらご報告させていただきます。
退会済みユーザー

退会済みユーザー

2018/10/22 13:35

hmmmさん> 勘違いがあるのでは? そもそも今回のスレッドの話は Active Directory ドメイン環境の話ではありません。 紹介された記事の「IE 以外でも統合 Windows 認証が使える」という話も今回の話とは関係ないのでは?(ところで、それは Microsoft が保証しているのですか?)。
hmmm

2018/10/22 14:46 編集

IISの設定を見たら単にWindows認証という名前でした。 クライアント系OSでもNTLM認証をサポートしているので(統合)Windows認証が動作します。 AD環境ではKerberos認証が使用できます。 Win10 Proで確認してみましたが、普通に(統合)Windows認証が動作しました。 https://www.teppi.com/column/fileblog_update/update0008/ のリンクは「IE 以外でも統合 Windows 認証が使える」という話ですが 統合Windows認証が使える条件を詳しく書いてあるので参考になると思います。 上記のIEの設定を変更すると、クレデンシャルダイアログが表示されたりされなかったりと変わります。 あと、上記のリンクには書いてなかったですが、 インターネットオプションの「詳細設定」タブの「統合Windows認証を利用する」も必要ですね。
退会済みユーザー

退会済みユーザー

2018/10/22 15:06

質問者さんが IIS に設定したサイトがイントラネットと見なされて、結果「イントラネットゾーンでのみ自動的にログオンする」によってダイアログによるユーザー情報の入力がスキップされて、ログイン状態になったと言われてますか?
hmmm

2018/10/22 22:33

そうですね。たぶん質問者さんもアドレスをlocalhostではなく127.0.0.1とか実際のipアドレスでアクセスすれば、ダイアログが表示されると思います。
退会済みユーザー

退会済みユーザー

2018/10/23 02:02

イントラネットと見なされるとデフォルトで自動ログオンになるのは確かなようですが、localhost は自動検出ではイントラネットに属するとは見なされないはずです。 質問者さんの質問の画像を見ると、問題のアプリは Default Web Site 下のアプリケーションとして IIS に設定しているようで、そうすると URL は http://localhost/アプリケーション名/webservice.asmx というようになります。 その場合、自分の環境での検証では[インターネットオプション]の[ローカルインターネット]の設定で http://localhost がイントラネットゾーンに追加されてない限り、「イントラネットと見なされない」=「自動ログオンにならない」という結果でした。 そのような設定をしたのでしょうか>質問者さん
yukidaruma.

2018/10/23 12:14

すみませんが一点、補足・訂正させていただきます。 「今回のシステム構築におけるADはまだ無いので関係ない」という意味合いで「ADは関係ない」と記載をしましたが、実際は会社管理のADのドメインには参加している状態となります。
yukidaruma.

2018/10/23 12:26 編集

hmmm様、SurferOnWww様、それぞれコメントありがとうございます。本日あまり時間が取れず細かく検証できていないのですが、確認できた内容だけお伝えをさせていただきます。 ①[インターネットオプション]>[セキュリティ]>[ローカルイントラネット]>[サイト]>[詳細設定]の設定  →"http://localhost"の設定はありませんでした。関係があるかはわかりませんが、"https://adfs.[ADの参加ドメイン名]"が登録されていました。 ②[インターネットオプション]>[セキュリティ]>[ローカルイントラネット]>[レベルのカスタマイズ]>[ユーザ認証]>[ログオン]  →「イントラネットゾーンでのみ自動的にログオンする」に設定されていました。 ③[インターネットオプション]>[詳細設定]>[セキュリティ]  →「統合Windows認証を使用する」はオフになっていました。 ④ブラウザからのアクセスを"localhost"ではなく"127.0.0.1"に変更  →ダイアログが表示されました。
退会済みユーザー

退会済みユーザー

2018/10/23 14:00

> 実際は会社管理のADのドメインには参加している状態 ← 今回の話は最初から質問者さんの組織のシステム管理者に聞くべきことだったのでは? グループポリシーとか ADFS とか第三者が知る由もない何かがあるのかも。質問者さんご自身も知らないようですのでここで何も知らない第三者とは話はできないように思います。
hmmm

2018/10/24 13:19

開発マシンはドメインに参加しているということですかね? .Netの内部実装がどうなってるか不明ですが、 ドメイン環境ならClientCredential.Domainにlocalhostではなくきちんとドメインを指定するか、 指定するのをやめてClientCredential.UserName = "Domain\username" としてみたらいいんじゃないですか? ドメインに所属していないのであれば、ClientCredential.Domainにlocalhostではなくちゃんとしたコンピューター名を指定してみてください。
yukidaruma.

2018/11/03 05:31

返信遅くなり申し訳ありません。本件についてあまり時間が取れない状況となってしまい、検証できていない状況です。進展ありましたら追記させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問