2011-05-18 33 views
15

Estoy tratando de implementar la autenticación de Windows en mi aplicación ASP.NET MVC2. He seguido todos los pasos sugeridos por la documentación oficial:Autenticación ASP.NET MVC y Windows con roles personalizados

<authentication mode="Windows" /> 

<authorization> 
    <deny users="?" /> 
</authorization> 

he especificado la autenticación NTLM. Hasta aquí todo bien. Todo funciona bien Me gustaría verificar los usuarios que iniciaron sesión en mi base de datos. Me gustaría obtener roles de mi tabla y luego administrar la autorización utilizando un atributo personalizado.
No deseo utilizar la membresía y el proveedor de roles. Ya tengo mis tablas Usuarios/Roles en su lugar porque se han usado para una Aplicación de Internet (esta es la Aplicación de Intranet).

En mi aplicación de Internet tenía un formulario donde el usuario ingresa los datos. El formulario se publica en un controlador que verifica todo y crea una cookie con el usuario (y roles) del usuario que ha iniciado sesión.

En mi global.asax atrapé el evento AuthenticateRequest donde leo la cookie y creo un principal personalizado que utilizo en toda la aplicación para verificar las autorizaciones.

¿Cómo puedo implementar esto con la Autenticación de Windows?

Respuesta

23

Simplemente cree un nuevo principal y asígnelo al usuario y conéctelo en Global.asax (o use un filtro de acción).

protected void Application_AuthenticateRequest(object sender, EventArgs args) 
{ 
    if(HttpContext.Current != null) 
    { 
    String [] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name); 

    GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles); 

    Thread.CurrentPrincipal = HttpContext.Current.User = principal; 
    } 
} 

Si un usuario no tiene ningún papel que coincide, pueden ser excluidos de la aplicación utilizando el elemento web.config authoirzation:

<authorization> 
    <allow roles="blah,whatever"/> 
    <deny users="*"/>    
</authorization> 
+0

@Xhalent: Sí, pero ... ¿dónde ...? – LeftyX

+0

Espero haberlo aclarado – Xhalent

+0

@ Xhalent: Gracias por su ayuda. Ahora parece claro. ¿Qué harías si un usuario no está autorizado para acceder a todas las aplicaciones (no está en la base de datos)? – LeftyX

6

sólo para añadir a la respuesta anterior, la esperanza esto ahorra algunos tiros en algún momento.

que tienen un sitio de intranet MVC 5 con VS 2015.

El código no funcionó para mí hasta la línea superior se ha actualizado con HttpContext.Current.User. El sitio me daba una referencia nula al HttpContext.Current.User si el usuario no se había creado en la base de datos. Al agregar .User a la primera línea, omitió ese código en la primera carga y funcionó.

if (HttpContext.Current.User != null) 
     { 


      String[] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name); 

      GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles); 

      Thread.CurrentPrincipal = HttpContext.Current.User = principal; 
     } 
Cuestiones relacionadas