Pregunta

Tengo una página ASPX (en el servidor A) que se invoca con las credenciales NTLM. Parte del trabajo de esa página es llamar a una página HTML (en el servidor B) y enviarla de nuevo al cliente. (El servidor de seguridad permite el acceso a A, pero no a B. Normalmente, al usuario se le permitiría acceder a ambos servidores). El servidor B tampoco está abierto al acceso anónimo, por lo que debo proporcionarle credenciales.

Si codifico algunas credenciales (de acuerdo con el código adjunto), funciona, pero lo ideal sería repetir las credenciales recibidas por la página .aspx. ¿Hay alguna forma de obtener estos NetworkCredentials para que pueda pasarlos?

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

Solución

Ciertamente, puede obtener el nombre de inicio de sesión de la persona que llama, pero no la contraseña. NTLM utiliza un mecanismo de desafío / respuesta, por lo que la contraseña nunca se transmite. Su servidor debe tener acceso a una contraseña equivalente (un hash) para formar el desafío y verificar la respuesta, pero incluso si puede obtenerla, esa contraseña equivalente no le servirá para tratar de formar credenciales que será aceptado por el servidor B.

Si puede configurar la suplantación, como se describe en otra respuesta, incluso eso no necesariamente le da lo que quiere. De forma predeterminada, un proceso de suplantación de servidor no tiene permitido transmitir su identidad a otro servidor. Ese segundo salto se conoce como delegación y debe configurarse explícitamente en los servidores involucrados (y / o en Active Directory).

Aparte de la delegación, creo que su única opción es mantener una base de datos de credenciales a las que el servidor A pueda acceder y presentar al servidor B. Construir de manera segura es un proceso sutil y lento. Por otro lado, hay una razón por la cual la delegación está deshabilitada por defecto. Cuando inicio sesión en un servidor, ¿quiero que se me permita usar mi identidad para acceder a otros servidores? La delegación es la opción más sencilla para usted, pero deberá asegurarse de que el servidor A no se comprometa a hacer cosas irresponsables con las identidades de sus usuarios.

Otros consejos

Page.User le dará el principio de seguridad del usuario bajo el que se está ejecutando la página.

Desde allí deberías poder averiguarlo.

¿Puede usted, en su escenario, hacerse pasar por la identidad de las personas que llaman? de esa manera ni siquiera necesitarías pasar credenciales, por ejemplo:

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

en web.config del servidor A. Pero esto, por supuesto, depende de su situación, ya que es posible que no quiera eso para el servidor A. Pero si puede, podría resolver su problema sin un código personalizado.

Aquí hay un enlace para configurar la suplantación: http: // msdn .microsoft.com / en-us / library / ms998351.aspx # paght000023_impersonatingorigcaller

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top