web-dev-qa-db-ja.com

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

数日前、クライアントとwcf Webサービス間のWindows認証を使用すると、認証の問題で頭痛がしました。私が得ていたエラーは、「HTTP要求はクライアント認証スキーム 'Negotiate'で許可されていません。サーバーから受信した認証ヘッダーは "NTLM"でした。

37

回答:問題は、そのような問題のすべての投稿が古いkerberosに関連しており、IISプロキシ資格情報またはAllowNTLMプロパティが役立つ問題でした。私の場合は何時間も地面からワームを拾った後に発見したのは、ややIISインストールにはNegotiate provider under IIS = Windows認証プロバイダーのリストです。したがって、追加して上に移動する必要がありました。WCFサービスは期待どおりに認証を開始しました。以下のスクリーンショットをご覧ください。匿名認証を使用したWindows認証の使用

Windows認証を右クリックして、プロバイダーのメニュー項目を選択する必要があります。

enter image description here

これが時間の節約に役立つことを願っています。

25

古いバージョンのWCFを以下の変更を加えてWCF 4にアップグレードしましたが、同様の変更を行うこともできます。

1。Web.config:

<system.serviceModel>
      <bindings>
        <basicHttpBinding>
          <binding name="Demo_BasicHttp">
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="InheritedFromHost"/>
            </security>
          </binding>
        </basicHttpBinding>
      </bindings>
      <services>
        <service name="DemoServices.CalculatorService.ServiceImplementation.CalculatorService" behaviorConfiguration="Demo_ServiceBehavior">
          <endpoint address="" binding="basicHttpBinding"
              bindingConfiguration="Demo_BasicHttp" contract="DemoServices.CalculatorService.ServiceContracts.ICalculatorServiceContract">
            <identity>
              <dns value="localhost"/>
            </identity>
          </endpoint>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="Demo_ServiceBehavior">
            <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
            <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
            <serviceDebug includeExceptionDetailInFaults="false"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <protocolMapping>
        <add scheme="http" binding="basicHttpBinding" bindingConfiguration="Demo_BasicHttp"/>
      </protocolMapping>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

2。App.config:

    <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ICalculatorServiceContract" maxBufferSize="2147483647" maxBufferPoolSize="33554432" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" sendTimeout="00:10:00" receiveTimeout="00:10:00">
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="4096" />
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:24357/CalculatorService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICalculatorServiceContract" contract="ICalculatorServiceContract" name="Demo_BasicHttp" />
    </client>
  </system.serviceModel>
6
Ajay Shankar

私にとっての解決策は、資格情報タイプとして「Ntlm」を使用することでした:

    XxxSoapClient xxxClient = new XxxSoapClient();
    ApplyCredentials(userName, password, xxxClient.ClientCredentials);

    private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials)
    {
        clientCredentials.UserName.UserName = userName;
        clientCredentials.UserName.Password = password;
        clientCredentials.Windows.ClientCredential.UserName = userName;
        clientCredentials.Windows.ClientCredential.Password = password;
        clientCredentials.Windows.AllowNtlm = true;
        clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
    }  
4
Sander Postma

これは正確な問題ではありませんが、これは ほぼ同じエラー のグーグルでの一番の結果です:

同じマシンでホストされているWCFサービスの呼び出しでこの問題が発生した場合は、BackConnectionHostNamesレジストリキーを設定する必要があります。

  1. Regeditで、次のレジストリサブキーを見つけてクリックします。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  2. 右クリック MSV1_0、[新規]をポイントし、[Multi-String Value
  3. [名前]列に「BackConnectionHostNames」と入力し、Enterキーを押します。
  4. BackConnectionHostNamesを右クリックし、[変更]をクリックします。 [値のデータ]ボックスに、コンピューターのローカル共有に使用されるCNAMEまたはDNSエイリアスを入力し、[OK]をクリックします。
    • 各ホスト名を別々の行に入力します。

詳細については、 IISでホストされているWCFサービスを呼び出す を参照してください。

1
fiat

私は同じ問題を抱えていて、IISのドメインから特定のユーザーを設定する->アクションサイドバー->基本設定->接続...->特定のユーザー

enter image description here

0
aliyan