web-dev-qa-db-ja.com

WCFTestClient HTTP要求は、クライアント認証スキーム「匿名」で許可されていません

1つのWCFサービスを作成し、サーバーに展開しました。このサービスを参照すると、?wsdl URLで肯定的な応答が返されます。今、私はWCFテストクライアントを介してサービスをテストしようとしています。適切なメタデータを示しています。しかし、サービスからメソッドのいずれかを呼び出そうとすると、例外が表示されます...ここにスタックトレースのエラーの詳細を示します。

HTTP要求は、クライアント認証スキーム「匿名」で許可されていません。サーバーから受信した認証ヘッダーは「Negotiate、NTLM」でした。

サーバースタックトレース:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest request、HttpWebResponse response、WebException responseException、HttpChannelFactory factory)
HTTP要求は、クライアント認証スキーム「匿名」で許可されていません。サーバーから受信した認証ヘッダーは「Negotiate、NTLM」でした。

サーバースタックトレース:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest request、HttpWebResponse response、WebException responseException、HttpChannelFactory factory)

クライアントバインディング:

<bindings>
    <wsHttpBinding>
        <binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
            allowCookies="false">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <reliableSession ordered="true" inactivityTimeout="00:10:00"
                enabled="false" />
            <security mode="None">
                <transport clientCredentialType="Windows" proxyCredentialType="None"
                    realm="" />
                <message clientCredentialType="Windows" negotiateServiceCredential="true"
                    establishSecurityContext="true" />
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

サーバーバインド:

<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
      <security mode="None">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />
      </security>
    </binding>
    <binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/>
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
      <security mode="None">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
        <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

クライアントのクライアントセクション:

<client>
    <endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService"
        contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" />
</client>

サーバーのサービスセクション:

<services>
    <service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior"
    name="GeoService.Saveology.com.CityStateServiceProvider">
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService"
        contract="SEO.Common.ServiceContract.ICityStateService" />
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
        contract="IMetadataExchange" />
    </service>
    <service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior"
    name="GeoService.Saveology.com.ServiceMagicServiceProvider">
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding" 
        contract="SEO.Common.ServiceContract.IServiceMagicService">
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
    </service>
</services>
62
user82613

呼び出していたサービスのセキュリティ構成を制御することはできませんでしたが、同じエラーが発生しました。クライアントを次のように修正できました。

  1. 構成で、セキュリティモードを設定します。

    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    
  2. コードで、偽装を許可するようにプロキシクラスを設定します(customerというサービスへの参照を追加しました)。

    Customer_PortClient proxy = new Customer_PortClient();
    proxy.ClientCredentials.Windows.AllowedImpersonationLevel =    
             System.Security.Principal.TokenImpersonationLevel.Impersonation;
    
80
Alex Peck

私は同様の問題を抱えています、あなたは試しましたか:

proxy.ClientCredentials.Windows.AllowedImpersonationLevel =   
          System.Security.Principal.TokenImpersonationLevel.Impersonation;
9
RailRhoad

私が見つけたこのエラーの別の可能な解決策。 OPの正確な質問には答えなかったかもしれませんが、このエラーメッセージを偶然見つけた他の人を助けるかもしれません。

次の行を複製するために、WebHttpBindingを使用してコードでクライアントを作成していました。

<security mode="TransportCredentialOnly">
  <transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>

私がしなければなりませんでした:

var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows;

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;を設定するだけでなく

7
Wilco

これはまだ回答されていないようです。これは正確な引用です ここから

WSHttpBindingは、SSP層で内部ネゴシエートを試行します。これを成功させるには、VDirのIISで匿名を許可する必要があります。その後、WCFはデフォルトでウィンドウクレデンシャルのSPNEGOを実行します。 IISレイヤーで匿名を許可することは、だれも許可しないことであり、WCFスタックに従います。

私はこれを次の方法で見つけました: http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

グーグルの後: http://www.google.tt/#hl=en&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous

6
Irwin

私は同様の問題を抱えていて、上記で提案されたすべてを試しました。次に、clientCreditialTypeをBasicに変更してみましたが、すべてうまくいきました。

<basicHttpBinding>
    <binding name="BINDINGNAMEGOESHERE" >
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic"></transport>
      </security>
    </binding>
  </basicHttpBinding>
4
PunkTurnet

これを機能させるために私がしなければならなかったことを以下に示します。これの意味は:

  1. カスタムUserNamePasswordValidator(Windowsアカウント、SQLServerまたはActiveDirectoryは不要-UserNamePasswordValidatorにはユーザー名とパスワードをハードコーディングするか、テキストファイル、MySQLなどから読み取ることができます)。
  2. https
  3. IIS7
  4. .net 4.0

私のサイトはDotNetPanelで管理されています。仮想ディレクトリには3つのセキュリティオプションがあります。

  1. 匿名アクセスを許可
  2. 基本認証を有効にする
  3. 統合Windows認証を有効にする

「匿名アクセスを許可する」だけが必要です(ただし、それだけでは十分ではありませんでした)。

セッティング

proxy.ClientCredentials.Windows.AllowedImpersonationLevel =  System.Security.Principal.TokenImpersonationLevel.Impersonation;

私の場合、違いはありませんでした。

ただし、このバインディングの使用は機能しました。

      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Windows" />
        <message clientCredentialType="UserName" />
      </security>        
3
Jimmy

Azureのステージング環境に外部サービスを呼び出すサービスをデプロイした後、今日同じエラーが発生しました。ローカルサービスはエラーなしで外部サービスを呼び出しましたが、展開後はそうではありませんでした。

最終的には、外部サービスにIP検証があることが判明しました。 Azureの新しい環境には別のIPがあり、拒否されました。

したがって、外部サービスを呼び出してこのエラーが発生した場合

IP制限の可能性があります。

1
rfcdejong

以下のようにクライアントでユーザー名とパスワードを入力してみてください

client.ClientCredentials.UserName.UserName = @ "Domain\username"; client.ClientCredentials.UserName.Password = "password";

1
user2659865

開発マシンでこの問題が発生しました(製品版は問題なく動作します)。 IISの設定を変更して匿名アクセスを許可し、資格情報として名前とパスワードを入力します。

私が確信している最善の方法ではありませんが、テスト目的で機能します。

0
David Brunelle