2011-02-07 1 views
11

クライアントの認証方式に不正である:私のIISの両方に、Webサービスを呼び出している間、HTTPリクエストは、私は次のエラーを取得する「NTLM」

The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'. The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'.

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

http://localhost/MySiteNameを使用してSilverlightクライアントがサーバーからアプリケーションを開くと、すべて正常に動作します。しかし、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> 
+0

私のWCFのWebサービスを呼び出すための設定をバインドされます:ASMX Webサービスを呼び出すための <バインディング名= "winAuthBasicHttpBinding"> <セキュリティモード= "TransportCredentialOnly"> <輸送clientCredentialType = "Windowsの" /> バインディングの構成は、次のとおりです。<バインディング名= "ClNtlmBinding "> kruvi

答えて

18

OK、ここに心に来るものです:

  • おそらくIISで実行されているWCFサービスは、その権限を持つセキュリティコンテキストで実行されている必要がありますtはWebサービスを呼び出します。あなたは、ドメインユーザーであるユーザー、理想的には専用のユーザーで、アプリケーションプール内に確実に存在する必要があります。
  • あなたは再びWindowsとテストにNtlmを変更してみてくださいmy WCF web service calls another ASMX web service, installed on a **different** web server
  • ので、偽装を使用してASMXに戻って渡すために、ユーザーのセキュリティトークンを使用するように偽装を使用することはできません。

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


UPDATE

委任(すなわち別のサーバにサーバから偽装を転送する)WCF下で可能です。このトピックhereを見てください。

+0

ありがとうございました。 ドメインユーザーをアプリケーションプールに設定すると、正常に動作しますが、WSへのすべての呼び出しは、アプリケーションプールドメインユーザーの下で実行されます。 偽装を使用してASMXを呼び出すことはできないため、コールはクライアントのユーザーセキュリティトークンで実行されますか? – kruvi

+0

ところで、特定のユーザー(クライアントにログインしているのと同じユーザー)になりすましを使用すると、すべて正常に動作することに言及するのを忘れてしまった: client = new ClCustomersServiceClient();クライアント。クライアント。クライアント。クライアント。クライアント。 client.ClientCredentials.Windows.ClientCredential = new NetworkCredential( "username"、 "password"、 "domain"); 応答=クライアント。ClCustomersQuery(リクエスト); – kruvi

+0

私は更新しました。 – Aliostad

7

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

私はthis linkに続き、それが私の問題を解決しました。私は私の構成で、次の操作を行う必要があった

<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> 
0

1):ここでApp.configのサンプルコードを示します(私は上のdevのシステムをオフに働いていたBackConnectionHostNamesとまたは無効にループバックチェック) http://support.microsoft.com/kb/896861

2)を追加します。隔離されたdevネットワーク。私は、WebサービスのURLにあるdevシステムのコンピュータ名を使って作業していましたが、(コンピュータ名ではなく)実稼働環境で使用されるURLにURLを変更したとき、NTLMエラーが発生しました。

3)セキュリティログで、サービスアカウントがMSDNの記事と同様のエラーでログインできなかったことがわかりました。

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

0

たぶん、あなたはを参照することができます:私のソリューションは、「NTLM」に2つのプロパティ authenticationSchemeとproxyAuthenticationSchemeを変更することがあり、その後、それが動作http://msdn.microsoft.com/en-us/library/ms731364.aspx を。

PS:私の環境は に従うようである - サーバ側:2.0 ASMX .NET - クライアント側:.NET 4

1

私はに

client.ClientCredentials.UserName.UserName = domain + "\\" + username; client.ClientCredentials.UserName.Password = password

からドメイン、ユーザ名、パスワードを移動しなければなりませんでした

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

2

解決策は、「Ntlm」を資格情報タイプとして使用することでした.Jeroen Kのソリューションと同様です。私は許可レベルを持っていた場合、私は希望プラス彼のポストではなく、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; 
    } 
関連する問題