Получите учетные данные NTLM из Ответа на странице APSX - PullRequest
1 голос
/ 01 октября 2008

У меня есть страница 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(); 
} 

Ответы [ 3 ]

1 голос
/ 01 октября 2008

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

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

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

0 голосов
/ 01 октября 2008

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

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

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

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

0 голосов
/ 01 октября 2008

Page.User предоставит вам принципала безопасности пользователя, под которым работает страница.

Оттуда вы сможете понять это.

...