
前提・実現したいこと
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サービスにアクセスした場合は以下の通り表示されます。
補足情報(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) 許可されていません





