Отражение, веб-сервис 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, которая должна помочь вам начать.
К вашему сведению, причина, по которой он работает в разработке, скорее всего потому, что ваш сервер разработки работает как вы, и, поскольку у вас есть доступ к веб-службе, он завершается успешно.