アクセス拒否 匿名認証がオフになっているときに Web サービスを呼び出すとき

この記事は、Web サービス アプリケーションを呼び出し、匿名アクセス認証がオフになっているときに発生するエラー (アクセス拒否) を解決するのに役立ちます。

元の製品バージョン: Web サービスの機能強化
元の KB 番号: 811318

現象

Web サービス アプリケーションを呼び出そうとすると、匿名アクセス認証がオフになると、次のエラー メッセージが表示されることがあります。

HTTP 状態 401: アクセス拒否で要求が失敗しました。
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。 エラーとコード内の発生場所の詳細については、スタック トレースを確認してください。
例外の詳細: System.Net.WebException: 要求が HTTP 状態 401: アクセス拒否で失敗しました。

原因

Web サービス アプリケーションに対して匿名アクセス認証がオフになっている場合、すべての呼び出し元アプリケーションは、要求を行う前に資格情報を提供する必要があります。 既定では、Web サービス クライアント プロキシは、Web サービス クライアント アプリケーションが実行されているセキュリティ コンテキストの資格情報を継承しません。

この問題を解決するには、Web サービス クライアント プロキシの Credentials プロパティを使用して、Web サービス クライアント認証のセキュリティ資格情報を設定する必要があります。

Credentials プロパティを設定するには、次のいずれかの解決策を使用します。

解決策 1: DefaultCredentials を Credentials プロパティに割り当てる

匿名アクセス認証がオフになっている間に Web サービスを呼び出すには、Web サービス プロキシ クラスの Credentials プロパティに DefaultCredentials を割り当てます。 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 のインスタンスを作成します。 認証の種類を使用して、NetworkCredential を CredentialCache クラスに追加します。 これを行うには、次のコードを使用します。

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

注:

CredentialCache クラスと NetworkCredential クラスは、System.Net 名前空間に属しています。

Credentials プロパティを設定する方法の詳細については、この記事の 「動作を再現する手順 」セクションを参照してください。

状態

この動作は仕様です。

動作の再現手順

DefaultCredentials は、アプリケーションが実行されている現在のセキュリティ コンテキストのシステム資格情報を表します。 クライアント側アプリケーションの場合、既定の資格情報は通常、プログラムを実行しているユーザーのユーザー名、パスワード、ドメインなどの Windows 資格情報です。 ASP.NET プログラムの場合、既定の資格情報は、ASP.NET ワーカー プロセスの ID のユーザー資格情報、または偽装されているユーザーです。 次のサンプル ASP.NET プログラムでは、DefaultCredentials は ASPNET ユーザー アカウント (または、呼び出し元に偽装が設定されていないため、Microsoft インターネット インフォメーション サービス [IIS] 6.0 で実行されるアプリケーションの NetworkService ユーザー アカウント) を表します。

  1. Visual C# .NET または Visual Basic .NET を使用して、新しい ASP.NET Web サービス を作成します。

  2. プロジェクトに WebServiceTest という名前を付けます

  3. 既定では、 Service1.asmx が作成されます。

  4. 既定の WebMethod "HelloWorld()" のコメントを解除します。

  5. [ ビルド ] メニューの [ ソリューションのビルド] を選択します。

  6. WebServiceTest への匿名アクセスをオフにします。 これを行うには、次の手順を実行します。

    1. コントロール パネルで、 [管理ツール] をダブルクリックします。

    2. [インターネット インフォメーション サービス] をダブルクリックします。

    3. [ インターネット インフォメーション サービス] を展開し、 WebServiceTest 仮想ディレクトリを見つけます。

    4. [WebServiceTest] を右クリックし、[プロパティ] を選択します。

    5. [ ディレクトリ セキュリティ ] タブを選択します。

    6. [ 匿名アクセスと認証制御] で、[編集] を選択 します

    7. [認証方法] ダイアログ ボックスで、[匿名アクセス チェック] ボックスをオフにします。

    8. [統合Windows 認証 チェック] ボックスを選択します。

      注:

      [統合されたWindows 認証] のみが選択されていることを確認します。

    9. [ OK] を選択 して、[ 認証方法 ] ダイアログ ボックスを閉じます。

    10. [OK] を選択して プロパティを閉じます。

  7. [ビルド] メニューの [ソリューションのビルド] をクリックします。

  8. ブラウザーに次のアドレスを入力して、 Service1 Web サービスの説明を表示します。

    http://localhost/WebServiceTest/Service1.asmx

  9. HelloWorld WebMethod をテストします。 WebMethod は期待どおりに動作します。

  10. Web アプリケーション ASP.NET テストに Web 参照 を追加します。 これを行うには、次の手順を実行します。

    1. Visual C# .NET または Visual Basic .NET を使用して、新しい ASP.NET Web アプリケーション を作成します。 プロジェクトに WebServiceCaller という名前を付けます

    2. 既定では、WebForm1.aspx が作成されます。

    3. ソリューション エクスプローラーで、[参照] を右クリックし、[Web 参照の追加] を選択します。

    4. [ アドレス ] テキスト ボックスに、次のように WebServiceTest の URL を入力します。

      http://localhost/WebServiceTest/Service1.asmx

    5. [ Go ] を選択するか Enter キーを押し、[ 参照の追加] を選択します。

  11. ソリューション エクスプローラーで、[WebForm1.aspx] を右クリックし、[コードの表示] を選択します。

  12. 次のコードを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())
    
  13. [ デバッグ ] メニューの [ スタート] を選択し、ブラウザーでアプリケーションを表示します。

  14. 「現象」セクションで説明されているエラー メッセージがブラウザーに表示されます。

  15. この問題を解決するには、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
    
  16. 手順 13 を繰り返します。

関連情報