Pergunta

Eu tenho uma página ASPX (No servidor A), que é invocado usando credenciais NTLM. Parte do trabalho dessa página é chamar uma página HTML (No servidor B) e procurador-lo de volta para o cliente. (O firewall permite o acesso a A, mas não para B. normalmente seria permitido O usuário acesso a ambos os servidores.). Servidor B também não é aberto para acesso anônimo, então eu preciso para fornecer credenciais para isso.

Se eu codificar algumas credenciais (conforme o código em anexo), ele funciona, mas o ideal Gostaria echo as credenciais que foram recebidas pela página .aspx. Existe alguma maneira de obter essas NetworkCredentials para que eu possa transmiti-los?

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(); 
} 
Foi útil?

Solução

Você certamente pode obter o nome de login do chamador, mas não a senha. NTLM usa um mecanismo de desafio / resposta, então a senha nunca é transmitida. Seu servidor deve ter acesso a uma senha-equivalente (um hash), a fim de formar o desafio e verificar a resposta, mas mesmo se você pode se apossar de que essa senha equivalente haverá utilidade para você na tentativa de formar credenciais que serão aceitos pelo servidor B.

Se você pode configurar a representação, conforme descrito em outra resposta, mesmo que não necessariamente obter o que você quer. Por padrão, um processo servidor personificando não está autorizado a transmitir a sua identidade para outro servidor. Essa segunda hop é conhecido como delegação e precisa ser explicitamente configurado nos servidores envolvidos (e / ou no Active Directory).

Além de delegação Eu acho que sua única opção é manter um banco de dados de credenciais que o servidor A pode acessar e apresentar para o servidor B. edifício que de uma maneira segura é um processo sutil e demorado. Por outro lado, há uma razão para que a delegação está desativado por padrão. Quando eu entrar em um servidor, eu quero que ele seja autorizado a usar a minha identidade para acessar outros servidores? A delegação é a opção mais simples para você, mas você precisa ter certeza de que um servidor não pode ser comprometida a fazer coisas irresponsáveis ??com identidades dos usuários.

Outras dicas

Page.User você irá obter o principal de segurança do usuário que a página é executado.

De lá você deve ser capaz de descobrir isso.

você em seu cenário pode representar a identidade chamadores? Dessa forma, você não tomaria mesmo precisa passar ao longo de credenciais, ex:

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

em web.config do servidor A. Mas isso, claro, depende de sua situação, como você pode não querer isso para servidor A. Mas se você pode isso poderia resolver seu problema sem código personalizado.

Aqui está um link para a criação de representação: http: // MSDN .microsoft.com / en-us / library / ms998351.aspx # paght000023_impersonatingorigcaller

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top