2013-09-30 29 views
7

私はこの1つで私の頭を裂いている、私はブラウザを介して呼び出すことができますWCFサービスがあり、以下のメソッドは私が(401)無許可エラーを取得します。そして、サービスは呼び出されません。さらに、私のローカルマシン(IIS Expressを使用したデバッグモード)からWebアプリケーションを実行すると、私の開発サーバー(IIS7)が動作しますが、Webアプリケーションを開発サーバーにデプロイし、 401エラーに失敗します。私はこれがIIS7と関係があると思っていますが、私は100%確実ではないし、役立つことは非常に役に立つでしょう。WCFサービスに資格情報を渡していない401

私は答えをオンラインで見たことがありますが、私が見つけた最高のものはthisです。次のように

マイサービスコールは、次のとおりです。

var request = (HttpWebRequest) WebRequest.Create(url); 
request.Method = "GET"; 
request.ContentType = "application/json; charset=utf-8"; 
request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested; 
request.Credentials = CredentialCache.DefaultCredentials; 

WebResponse responce = request.GetResponse(); 
Stream reader = responce.GetResponseStream(); 

var sReader = new StreamReader(reader); 
string outResult = sReader.ReadToEnd(); 
sReader.Close(); 

var result = (T) JsonConvert.DeserializeObject(outResult, typeof (T)); 
return result; 

サービスのための私の構成は次のようになります。直前に、私はクライアントサービスの呼び出しで、いくつかのログを入れている

<service name="RGMPServices.Householding.Services.AccountService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IAccountService" /> 
    </service> 

    <service name="RGMPServices.Householding.Services.HouseholdService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IHouseholdService" /> 
    </service> 

    <service name="RGMPServices.Householding.Services.UserService" behaviorConfiguration="Default"> 
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IUserService" /> 
    </service> 
</services> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webBehaviour"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<standardEndpoints> 
    <webHttpEndpoint> 
    <standardEndpoint name="SecuredHttpEndpointBinding" helpEnabled="true" automaticFormatSelectionEnabled="true"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </standardEndpoint> 
    </webHttpEndpoint> 
</standardEndpoints> 

私はサービスを呼び出し、応答は:

DEBUG 2013-10-01 13:15:13,569 452ms ServiceGetSingle - Passing Login: MYLANDOMAIN\MYLANUSERNAME

ERROR 2013-10-01 13:15:13,631 514ms ServiceGetSingle - ERROR Calling ServiceGetSingle with user credentials login: MYLANDOMAIN\MYLANUSERNAME System.Net.WebException: The remote server returned an error: (401) Unauthorized. at System.Net.HttpWebRequest.GetResponse() at Householding.Common.ServiceHelper.ServiceGetSingle[T](String url)

コードは次のようになります。

私はまだ再びWCFサービスにアクセスするために私を許可していないが、私のドメインアカウントに私のウェブサイトのためのアプリケーションプールを設定しても
logger.Debug("Passing Login: " 
    + System.Security.Principal.WindowsIdentity.GetCurrent().Name) 

:それはブラウザのために働いています。とても奇妙!

+0

WCFとWindows認証が動作するのは必ずしも容易ではありません。 httpフローをトレースするには、クライアントでFiddlerを試してみてください。また、サーバー上でWCFトレースを構成してみてください。http://msdn.microsoft.com/en-us/library/ms733025.aspx – Joe

答えて

1

Integrated Windows Authentication(IWA)とKerberosを使用すると、ダブルホップの問題が発生する可能性があります。最初のホップは、ブラウザからWebアプリケーションへのホップです。 2番目のホップは、WebアプリケーションからWCFサービスへのホップです。ここで

は、より完全に問題を説明するいくつかのリソースであり、その溶液提供することがあります:

あなたがサポートするためにActive Directoryを構成することができますがKerberos delegation (通常、インフラストラクチャの人はこれが気に入らない)、あるいは偽装をオフにすることができますエンドユーザーの代わりにWCFサービスで認証できるWebアプリケーションとIISアプリケーションプールの「サービス」アカウント。

1

Devサーバーのデフォルトの資格情報は何ですか?そこにログを作ってみて、あなたが得るものを見てください。

これは私が疑うところです:ローカルで実行すると、資格情報はあなたのウィンドウの信用です。 devサーバーをdevから呼び出すと、資格情報はWebサイトが実行されているアカウントになります。その特定のアカウントにアクセス権がない場合、それは爆発するでしょう。

+0

問題を更新しました – Joshy

+0

devサーバーからアプリケーションを実行するときのログですか? –

+0

はい、それはdevサーバーからです – Joshy

1

これまで説明したとおり、これは偽装の問題のようです。 資格情報を変更するために「実行者」でクライアントプログラムを起動しようとしましたか?

また、あなたは

request.Credentials = new NetworkCredential("MyUsername", "MyPassword"); 

にコード

request.Credentials = CredentialCache.DefaultCredentials; 

のこの行を変更し、それが動作するかどうかを確認することができます。また、動作させるには、Webサーバーに "MyPassword"というアカウント "MyUserName"を作成する必要があります。

1

これらのエラーは、認証されたユーザーがWCFサービスがホストされている物理パスにアクセスできない場合に発生する可能性があります。 devサーバー上で、IISマネージャーを開き、サービスの仮想ディレクトリに移動します。アクションバーの右側で、[基本設定]をクリックします。 [物理パス]テキストボックスの下にある[接続方法]をクリックします。 「特定のユーザー」を選択し、devサーバー上の物理フォルダに対する権限を持っていることがわかっているユーザーアカウントに設定してみてください。通常、これはパスワードが期限切れでないサービスアカウントです。

1

ブラウザから実行すると、ブラウザは認証情報を送信しています。また、iis expressはログインしているユーザーとして実行されるため、資格情報も送信されます。アイリスは違う、それはローカルアカウントとして実行されます。フロントエンドで認証があっても、バックエンドには渡されません。 Windowsの偽装トークンは、許可されたホップ数(通常は0)に制限があります。これは、実行していることを正確に防止するために行われます。 フロントエンド認証がバックエンドに流れるようにするには、認証を自分で行い、ユーザー/グラブを取得する必要があります。あるいは、自分で認証を行う場合は、別のマシンへのホップを許可する偽装トークンを作成することができ、それが動作するはずです。

関連する問題