0

.LoadFile('from assembly') でロードされた DLL を使用して、他の webservices/db 接続を動的に呼び出すことができる WCF Web サービスを作成しました。これらのアセンブリの 1 つの内部で、別の Web サービスが次のように渡されたネットワーク資格情報を使用して動的に呼び出されます。

WebClient client = new WebClient();
client.Credentials = this.networkCredential;  //This credential is passed in
RequestStream requestStream = client.OpenRead(this.url);

//残りのコード。.OpenRead で 401 エラーが発生しています (認証されていません)。

テスト コンソール アプリケーションからデバッグ モードでこれを実行し、次のようにネットワーク資格情報を作成すると、次のようになります。

NetworkCredential networkCredential = new NetworkCredential(<userid>,<password>,<domain>);

これはうまくいきます。

失敗したコードは、次のように networkcredentials を提供しています

System.Net.NetworkCredential networkCredential = System.Net.CredentialCache.DefaultNetworkCredentials;

どんな助けでも大歓迎です。

4

1 に答える 1

0

偽装を使用していない限り、DefaultNetworkCredentials は、サイトにアクセスしているユーザーの資格情報ではなく、ASP.NET Web サイトを実行しているプロセスの資格情報を使用しようとします。ユーザーの資格情報を使用するには、偽装コンテキストで Web サービスへの呼び出しをラップする必要があります。

var impersonationContext = HttpContext.Current.Request.User.Identity.Impersonate();
if(impersonationContext != null)
{
    //call your webservice here.  DefaultNetworkCredentials will be what you expect.
    impersonationContext.Undo();
}

もちろん、条件はあります。ユーザーは認証されている必要があります (匿名ユーザーが Web サービスへのアクセス権も持っていない限り、匿名ユーザーになることはできません)。また、上記のコードは一例に過ぎません。本番環境のコードでは、他にも考慮すべき点がかなりあります。これは、開始するのに役立つmsdn の記事です。

参考までに、開発で機能する理由は、開発サーバー プロセスがユーザーとして実行され、Web サービスにアクセスできるため、成功する可能性が高いためです。

于 2013-05-03T16:41:48.497 に答える