Отражение, веб-сервис WCF, сборка LoadFrom. Проблемы с сетевыми учетными данными

Я создал веб-сервис WCF, который может динамически вызывать другие соединения веб-сервисов /db с DLL, загруженными с помощью.LoadFile ("из сборки"). Внутри одной из этих сборок другой веб-сервис вызывается динамически с передачей сетевых учетных данных следующим образом:

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>);

это отлично работает

Сбой кода обеспечивает сетевые учетные данные следующим образом

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

Любая помощь будет принята с благодарностью.

1 ответ

Если вы не используете олицетворение, DefaultNetworkCredentials пытается использовать учетные данные процесса, выполняющего ваш сайт ASP.NET, а не учетные данные пользователя, обращающегося к вашему сайту. Чтобы использовать учетные данные пользователя, вам следует заключить вызов веб-служб в контекст олицетворения.

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

Есть, конечно, условия. Пользователь должен быть аутентифицирован (не может быть анонимным пользователем, если только анонимный пользователь не имеет доступа к вашему веб-сервису). Кроме того, приведенный выше код является лишь примером - в производственном коде есть немало других вещей, которые следует учитывать. Вот статья MSDN, которая должна помочь вам начать.

К вашему сведению, причина, по которой он работает в разработке, скорее всего потому, что ваш сервер разработки работает как вы, и, поскольку у вас есть доступ к веб-службе, он завершается успешно.

Другие вопросы по тегам