Получите учетные данные NTLM из ответа на странице APSX

StackOverflow https://stackoverflow.com/questions/158800

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть страница ASPX (на сервере A), которая вызывается с использованием учетных данных NTLM.Часть работы этой страницы состоит в том, чтобы вызвать HTML-страницу (на сервере B) и передать ее обратно клиенту.(Брандмауэр разрешает доступ к A, но не к B.Обычно пользователю разрешается доступ к обоим серверам.).Сервер B также не открыт для анонимного доступа, поэтому мне нужно предоставить ему учетные данные.

Если я жестко закодирую некоторые учетные данные (согласно прилагаемому коду), это сработает, но в идеале я бы повторил учетные данные, которые были получены на странице .aspx.Есть ли какой-нибудь способ получить эти NetworkCredentials, чтобы я мог передать их дальше?

protected void Page_Load(object sender, EventArgs e) { 
    Response.Clear(); 
    WebClient proxyFile = new WebClient(); 
    CredentialCache cc = new CredentialCache(); 
    cc.Add(new Uri("http://serverB/"), "NTLM", 
        new NetworkCredential("userName", "password", "domain")); 
    proxyFile.Credentials = cc; 

    Stream proxyStream = proxyFile.OpenRead("http://serverB/Content/webPage.html"); 
    int i; 
    do { 
        i = proxyStream.ReadByte(); 
        if (i != -1) { 
            Response.OutputStream.WriteByte((byte)i); 
        } 
    } while (i != -1); 
    Response.End(); 
} 
Это было полезно?

Решение

Вы, конечно, можете получить логин вызывающего абонента, но не пароль.NTLM использует механизм запроса / ответа, поэтому пароль никогда не передается.Ваш сервер должен иметь доступ к эквиваленту пароля (хэшу), чтобы сформировать запрос и проверить ответ, но даже если вы сможете получить его, этот эквивалент пароля не будет вам полезен при попытке сформировать учетные данные, которые будут приняты сервером B.

Если вы можете настроить олицетворение, как описано в другом ответе, даже это не обязательно даст вам то, что вы хотите.По умолчанию процессу, выдающему себя за сервер, не разрешается передавать свои идентификационные данные другому серверу.Этот второй этап известен как делегирование и должен быть явно настроен на задействованных серверах (и / или в Active Directory).

Помимо делегирования, я думаю, ваш единственный вариант - поддерживать базу данных учетных данных, к которой сервер A может получить доступ и представить серверу B.Создание этого безопасного способа - сложный и отнимающий много времени процесс.С другой стороны, есть причина, по которой делегирование по умолчанию отключено.Когда я захожу на сервер, хочу ли я, чтобы ему разрешалось использовать мою личность для доступа к другим серверам?Делегирование - самый простой вариант для вас, но вы должны быть уверены, что сервер A не может быть скомпрометирован для совершения безответственных действий с личностями ваших пользователей.

Другие советы

Страница.Пользователь предоставит вам имя участника безопасности пользователя, под которым запущена страница.

Оттуда вы должны быть в состоянии разобраться в этом.

Можете ли вы в своем сценарии выдать себя за абонента?таким образом, вам даже не нужно было бы передавать учетные данные, например:

<authentication mode="Windows" />
<identity impersonate="true" />

в web.config сервера A.Но это, конечно, зависит от вашей ситуации, так как вы можете не захотеть этого для сервера A.Но если вы сможете, это могло бы решить вашу проблему без пользовательского кода.

Вот ссылка для настройки олицетворения: http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingorigcaller

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top