web-dev-qa-db-ja.com

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

Webサービスを呼び出すと、次のエラーが表示されます。

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

IIS(7)の両方でWCF Webサービスを呼び出すSilverlight 4アプリケーションがあります。WCFWebサービスは、NTLMを使用して別のWebサーバーにインストールされた別のASMX Webサービスを呼び出しますWindows認証)。私のサーバーとASMX Webサービスをホストするサーバーの両方が同じドメインにあります。

Silverlightクライアントがhttp://localhost/MySiteNameを使用してサーバーからアプリケーションを開くと、すべてが正常に機能します。しかし、Silverlightクライアントがhttp://MyServerName/MySiteNameを使用して、サーバーではなく同じドメインにある別のクライアントからアプリケーションを開くと、エラーが発生します。

IISでWindows認証が有効になっています。 IISで匿名認証が無効になっています。

WCF Webサービスを呼び出すためのバインド構成は次のとおりです。

    <binding name="winAuthBasicHttpBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>

ASMX Webサービスを呼び出すためのバインディング構成は次のとおりです。

    <binding name="ClNtlmBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm" />
      </security>
    </binding>
13
kruvi

OK、ここに頭に浮かぶものがあります:

  • おそらくIISで実行されているWCFサービスは、Webサービスを呼び出す特権を持つセキュリティコンテキストで実行されている必要があります。ドメインユーザーであるユーザーとアプリプールで確認する必要があります-理想的には専用ユーザー。
  • 偽装を使用してユーザーのセキュリティトークンを使用して、偽装を使用してASMXに戻すことはできません。my WCF web service calls another ASMX web service, installed on a **different** web server
  • NtlmWindowsに変更して、もう一度テストしてください。

なりすましに関するいくつかの言葉。 基本的に、あるサーバーに取得した偽装トークンを使用して別のサーバーに渡すことはできないという既知の問題です。その理由は、トークンがユーザーのパスワードを使用する一種のハッシュであり、生成されたマシンに対して有効であるため、中間サーバーから使用できないためと思われます。


更新

WCFでは委任が可能です(つまり、サーバーから別のサーバーに偽装を転送します)。このトピックを見てください here

18
Aliostad

質問が投稿されてから長い時間が経ちましたが、同様のシナリオで同じ問題を経験しました。コンソールアプリケーションがあり、Webサービスを使用していましたが、Webサービスが配置されているIISサーバーでWindows認証(NTLM)が有効になっています。

このリンク に従って、問題を解決しました。 App.configのサンプルコードは次のとおりです。

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="Service1Soap">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Ntlm" proxyCredentialType="None"
                        realm=""/>
                    <message clientCredentialType="UserName" algorithmSuite="Default"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost/servicename/service1.asmx" 
            binding="basicHttpBinding" bindingConfiguration="ListsSoap"/>
    </client>
</system.serviceModel>
7
Yogesh Jindal

私にとっての解決策は、Jeroen Kのソリューションと同様に、資格情報タイプとして「Ntlm」を使用することでした。私が彼の投稿にプラスする許可レベルがあれば、ここにコード全体を投稿できます。これは、Windowsと基本認証のような他の資格情報タイプの両方をサポートします。

    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

ドメイン、ユーザー名、パスワードをから移動する必要がありました

client.ClientCredentials.UserName.UserName = domain + "\\" +ユーザー名; client.ClientCredentials.UserName.Password = password

client.ClientCredentials.Windows.ClientCredential.UserName = username; client.ClientCredentials.Windows.ClientCredential.Password = password; client.ClientCredentials.Windows.ClientCredential.Domain = domain;

3
Jeroen K

1)私は自分の設定で次のことをしなければなりませんでした:(BackConnectionHostNamesを追加するか、ループバックチェックを無効にする) http://support.Microsoft.com/kb/896861

2)隔離された開発ネットワーク上の開発システムで作業していました。 WebサービスへのURLでdevシステムのコンピューター名を使用して動作するようになりましたが、URLを(コンピューター名ではなく)本番で使用されるURLに変更すると、NTLMエラーが発生し始めました。

3)セキュリティログが、MSDNの記事にあるようなエラーでサービスアカウントがログインに失敗したことを示していることに気付きました。

4)BackConnectionHostNamesを追加すると、サーバー上で実行されているブラウザーを介してサーバーにログインできるようになりましたが、Webサービスの認証を試みたときにサービスアカウントにNTLMエラーが残っていました。ループバックチェックを無効にして、それを修正しました。

0
WWC

http://msdn.Microsoft.com/en-us/library/ms731364.aspx 私の解決策は、2つのプロパティauthenticationSchemeとproxyAuthenticationSchemeを「Ntlm」に変更してから動作します。

PS:私の環境は次のとおりです-サーバー側:.net 2.0 ASMX-クライアント側:.net 4

0
Sega