2009-08-06 24 views
8

Tengo una aplicación interna que tiene dos niveles de seguridad. FormsAuthentication para aplicaciones orientadas al cliente y NTLM Autenticación integrada para la interfaz de administración.Suplantación de usuarios a través de NTLM

Puedo suplantar fácilmente a clientes simplemente creando la cookie .ASPXAUTH adecuada con los métodos de la clase FormsAuthentication. Sin embargo, la generación de encabezado de HTTP Autenticación para NTLM me supera.

Tenía mis esperanzas cuando encontré este artículo (http://msdn.microsoft.com/en-us/library/ms998358.aspx#paght000025_usingimpersonation) pero luego me di cuenta de que solo creaba un contexto para ejecutar código durante la duración de la solicitud. Y me gustaría cambiar mi sesión completa para hacer que el servidor crea que estoy usando otro inicio de sesión de dominio. Tengo privilegios administrativos en mi cuenta, así que no es para atormentar o robar contraseñas de dominio.

¿Es posible? Gracias.

Respuesta

7

Supongamos que tiene la autenticación Forms habilitada la aplicación ASP.NET con el formulario de inicio de sesión login.aspx y sus usuarios se almacenan en la base de datos. Ahora desea admitir tanto la autenticación Forms como la de Windows. Eso es lo que hago:

Para la autenticación de formularios, uso SQL DB con, por ejemplo, la tabla Usuarios. Agrego a esta tabla nueva columna llamada WindowsUserName en el que voy a guardar el nombre de usuario de Windows en forma del equipo \ usuario

En forma Login.aspx agrego un método, que enviará una respuesta que se muestra la ventana de inicio:

private void ActivateWindowsLogin() 
{ 
    Response.StatusCode = 401; 
    Response.StatusDescription = "Unauthorized"; 
    Response.End(); 
} 

En alguna parte tengo un enlace como <a href="login.aspx?use=windows">Admin</a>

En Load Login.aspx he añadido:

if (Request.QueryString["use"] == "windows") 
{ 
    var windowsuser = Request.ServerVariables["LOGON_USER"]; 
    if (windowsuser.Length == 0) 
     ActivateWindowsLogin(); 
    else 
    { 
     // get userId from DB for Windows user that was authenticated by IIS 
     // I use userId in .ASPXAUTH cookie 
     var userId = GetUserIdForWindowsUser(windowsuser); 
     if (userId > 0) //user found 
     { 
      // here we get User object to check roles or other stuff 
      var user = GetApplicationUser(userId); 
      // perform additional checks here and call ActivateWindowsLogin() 
      // to show login again or redirect to access denied page. 
      // If everythig is OK, set cookie and redirect 
      FormsAuthentication.SetAuthCookie(userId.ToString(), false); 
      Response.Redirect(FormsAuthentication.GetRedirectUrl(userId.ToString(), false), true); 
     } 
     else //user not found 
      ActivateWindowsLogin(); 
    } 
} 
else 
{ 
    //your Forms auth routine 
} 

GetUserIdForWindowsU ser y GetApplicationUser son mis métodos solo para muestra.

+0

La cosa es que dos esquemas de autenticación gobiernan dos partes diferentes del sitio web, y no puedo mezclarlos. Sin embargo, planeo separarlos en dos aplicaciones diferentes. Una vez hecho esto, puedo usar Forms AuthCookie, pero todavía validar con cuentas de dominio. –

Cuestiones relacionadas