7

私はこれで髪を引き裂いています。ブラウザから呼び出すことができる WCF サービスがあり、正常に動作します。以下のメソッドを使用して Web アプリケーションから呼び出すと、(401) Unauthorizedエラーが発生します。そして、サービスは呼び出されません。さらに、開発サーバー (IIS7) を指すローカル マシン (IIS Express を使用したデバッグ モード) から Web アプリケーションを実行すると動作しますが、Web アプリケーションを開発サーバーにデプロイして開発サーバー サービスを指すと、 401 エラーで失敗します。これは IIS7 に関係していると思いますが、100% 確信があるわけではなく、ヘルプがあれば非常に便利です。

私は答えをオンラインで探しましたが、これまでのところ私が見つけた最高のものはこれです。

私のサービスコールは次のとおりです。

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 - ログインの受け渡し: MYLANDOMAIN\MYLANUSERNAME

ERROR 2013-10-01 13:15:13,631 514ms ServiceGetSingle - ユーザー資格情報ログインで ServiceGetSingle を呼び出すエラー: MYLANDOMAIN\MYLANUSERNAME System.Net.WebException: リモート サーバーがエラーを返しました: (401) 権限がありません。System.Net.HttpWebRequest.GetResponse() で Householding.Common.ServiceHelper.ServiceGetSingle[T](String url) で

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

logger.Debug("Passing Login: "
    + System.Security.Principal.WindowsIdentity.GetCurrent().Name)

Web サイトの AppPool をドメイン アカウントに設定しても、WCF サービスへのアクセスはまだ許可されていませんが、ブラウザでは機能しています。とても奇妙!

4

5 に答える 5

1

Dev サーバーの既定の資格情報は何ですか? すぐにログを作成して、何が得られるかを確認してください。

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

于 2013-10-01T16:07:54.623 に答える
1

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

于 2013-10-06T12:22:50.320 に答える
1

彼らが前に言ったように、これはなりすましの問題のようです。資格情報を変更するために、「run as」でクライアント プログラムを起動しようとしましたか?

さらに、このコード行を変更できます

request.Credentials = CredentialCache.DefaultCredentials;

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

そして、それが機能するかどうかを確認してください。また、それを機能させるには、Web サーバー上に「MyPassword」でアカウント「MyUserName」を作成する必要があります。

于 2013-10-04T15:34:02.280 に答える
1

統合 Windows 認証(IWA) とKerberosを使用している場合、ダブルホップの問題の犠牲になっている可能性があります。最初のホップは、ブラウザーから Web アプリケーションまでです。2 番目のホップは、Web アプリケーションから WCF サービスへのホップです。

問題をより完全に説明し、解決策を提供する可能性のあるリソースを次に示します。

Kerberos 委任をサポートするように Active Directory を構成することもできます(通常、インフラストラクチャ担当者はこれを好みません)。または、偽装をオフにして、Web アプリケーションと IIS アプリケーション プールに "サービス" アカウントを使用し、WCF サービスで認証できるようにすることもできます。エンドユーザーに代わって。

于 2013-10-10T17:28:59.947 に答える