この記事は、Web サービス アプリケーションを呼び出し、匿名アクセス認証が無効になっているときに発生するエラー (アクセス拒否) を解決するのに役立ちます。
元の製品バージョン: Web サービスの機能強化
元の KB 番号: 811318
現象
Web サービス アプリケーションを呼び出そうとしたときに匿名アクセス認証が無効になっていると、次のエラー メッセージが表示されることがあります。
HTTP 状態 401: アクセス拒否で要求が失敗しました。
説明: 現在の Web 要求の実行中にハンドルされない例外が発生しました。 エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。
例外の詳細: System.Net.WebException: 要求が HTTP 状態 401: アクセス拒否で失敗しました。
原因
Web サービス アプリケーションに対して匿名アクセス認証が無効になっている場合、すべての呼び出し元アプリケーションは、要求を行う前に資格情報を指定する必要があります。 既定では、Web サービス クライアント プロキシは、Web サービス クライアント アプリケーションが実行されているセキュリティ コンテキストの資格情報を継承しません。
この問題を解決するには、Web サービス クライアント プロキシの Credentials プロパティを使用して、Web サービス クライアント認証のセキュリティ資格情報を設定する必要があります。
Credentials プロパティを設定するには、次のいずれかの解決策を使用します。
解決策 1: Credentials プロパティに DefaultCredentials を割り当てる
匿名アクセス認証がオフになっている間、Web サービス プロキシ クラスの Credentials プロパティに DefaultCredentials を割り当てて Web サービスを呼び出します。 CredentialCache クラスの DefaultCredentials プロパティは、アプリケーションが実行されているセキュリティ コンテキストのシステム資格情報を提供します。 これを行うには、次のコードを使用します。
Visual C# .NET サンプル
//Assigning DefaultCredentials to the Credentials property
//of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;
Visual Basic .NET サンプル
'Assigning DefaultCredentials to the Credentials property
'of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials
解決策 2: CredentialCache クラスを使用する
CredentialCache クラスを使用して、Web サービス クライアント認証の資格情報を指定できます。 CredentialCache クラスのインスタンスを作成します。 指定したユーザー名、パスワード、およびドメインを使用する NetworkCredential のインスタンスを作成します。 認証の種類を使用して、CredentialCache クラスに NetworkCredential を追加します。 これを行うには、次のコードを使用します。
Visual C# .NET サンプル
//Create an instance of the CredentialCache class.
CredentialCache cache = new CredentialCache();
// Add a NetworkCredential instance to CredentialCache.
// Negotiate for NTLM or Kerberos authentication.
cache.Add( new Uri(myProxy.Url), "Negotiate", new NetworkCredential("UserName", "Password", "Domain"));
//Assign CredentialCache to the Web service Client Proxy(myProxy) Credetials property.
myProxy.Credentials = cache;
Visual Basic .NET サンプル
'Create an instance of the CredentialCache class.
Dim cache As CredentialCache = New CredentialCache()
'Add a NetworkCredential instance to CredentialCache.
'Negotiate for NTLM or Kerberos authentication.
cache.Add(New Uri(myProxy.Url), "Negotiate", New NetworkCredential("UserName", "Password", "Domain"))
'Assign CredentialCache to the Web service Client Proxy(myProxy) Credetials property.
myProxy.Credentials = cache
Note
CredentialCache クラスと NetworkCredential クラスは、System.Net 名前空間に属しています。
Credentials プロパティを設定する方法の詳細については、この記事の「 Steps to reproduce the behavior 」セクションを参照してください。
状態
この動作は仕様によるものです。
動作を再現する手順
DefaultCredentials は、アプリケーションが実行されている現在のセキュリティ コンテキストのシステム資格情報を表します。 クライアント側アプリケーションの場合、既定の資格情報は通常、プログラムを実行しているユーザーのユーザー名、パスワード、ドメインなどの Windows 資格情報です。 ASP.NET プログラムの場合、既定の資格情報は、ASP.NET worker プロセスの ID のユーザー資格情報、または偽装されているユーザーです。 次のサンプル ASP.NET プログラムでは、DefaultCredentials は、呼び出し元に偽装が設定されていないため、ASPNET ユーザー アカウント (または Microsoft インターネット インフォメーション サービス [IIS] 6.0 で実行されるアプリケーションの NetworkService ユーザー アカウント) を表します。
Visual C# .NET または Visual Basic .NET を使用して新しい ASP.NET Web サービスを作成します。
プロジェクトに WebServiceTestという名前を付けます。
既定では、 Service1.asmx が作成されます。
既定の WebMethod "HelloWorld()" のコメントを解除します。
[ Build メニューの [ソリューションのビルド] 選択。
WebServiceTest への匿名アクセスを無効にします。 これを行うには、次の手順を実行します。
コントロール パネルで、Administrative Tools をダブルクリックします。
[インターネット インフォメーション サービス] をダブルクリックします。
インターネット インフォメーション サービス展開し、WebServiceTest 仮想ディレクトリを見つけます。
WebServiceTest を右クリックし、Properties を選択します。
[ディレクトリ セキュリティ] タブをクリックします。
[ のアクセスと認証の制御で、 Edit を選択します。
[ 認証方法 ] ダイアログ ボックスで、[ Anonymous アクセス ] チェック ボックスをオフにします。
[Windows 認証] チェック ボックスをオンにします。
Note
Integrated Windows 認証のみが選択されていることを確認します。
OK を選択して、[認証方法] ダイアログ ボックスを閉じます。
selectOKを閉じるには Properties。
[ビルド] メニューの [ソリューションのビルド] を選択します。
ブラウザーに次のアドレスを入力して、 Service1 Web サービスの説明を表示します。
http://localhost/WebServiceTest/Service1.asmx
HelloWorld WebMethod をテストします。 WebMethod は期待どおりに動作します。
Web アプリケーションのテストに Web 参照 ASP.NET 追加。 これを行うには、次の手順を実行します。
Visual C# .NET または Visual Basic .NET を使用して新しいASP.NET Web アプリケーションを作成します。 プロジェクト WebServiceCallerという名前を付けます。
既定では、WebForm1.aspx が作成されます。
ソリューション エクスプローラーで、References を右クリックし、[Web 参照の追加] 選択。
Address テキスト ボックスに、WebServiceTest の URL を次のように入力します。
http://localhost/WebServiceTest/Service1.asmx
Go を選択するか Enter キーを押して、[参照の追加] 選択します。
ソリューション エクスプローラーでWebForm1.aspxを右クリックし、[コードの表示] 選択。
次のコードをthePage_Loadeventに追加します。
Visual C# .NET サンプル:
// Start an instance of the Web service client-side proxy. localhost.Service1 myProxy = new localhost.Service1(); Response.Write( myProxy.HelloWorld());
Visual Basic .NET サンプル:
'Start an instance of the Web service client-side proxy. Dim myProxy As localhost.Service1 = New localhost.Service1() Response.Write(myProxy.HelloWorld())
Debug メニューの Start を選択し、ブラウザーでアプリケーションを表示します。
「現象」セクションで説明されているエラー メッセージがブラウザーに表示されます。
この問題を解決するには、Web サービスクライアント側プロキシの Credentials プロパティに DefaultCredentials を割り当てます。 これを行うには、"Response.Write( myProxy.HelloWorld())" 行の前に次のコードを挿入します。
Visual C# .NET サンプル:
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;
Visual Basic .NET サンプル:
myProxy.Credentials = System.Net.CredentialCache.DefaultCredentials
手順 13 を繰り返します。