2009-08-19 27 views
14

Este proyecto en el que estoy trabajando me exige mantener un DB local de usuarios administradores y utilizar un DB externo para usuarios regulares. A cualquier persona que apruebe la autenticación en el db del administrador se le debe asignar el rol 'admin', y a cualquier persona autenticada a través del otro db siempre se le asignará un rol de 'usuario'.¿Cómo configuro manualmente el rol de un usuario en ASP.NET MVC?

¿Puedo asignar manualmente estos roles? No necesito la complejidad de un proveedor de funciones ni nada, ya que solo estoy usando estos dos roles, que SIEMPRE se basarán en el db con el que se autentiquen.

Sería una GRAN ayuda si pudieras proporcionar un código de muestra o un enlace a cierta documentación. ¡Gracias!

EDIT:

Actualmente no estoy utilizando el proveedor de funciones y la creación de uno parece como una molestia. Sé que no es la 'mejor práctica', pero solo necesito asignar 1 de 2 roles durante el inicio de sesión (esto nunca cambiará). Tampoco tiene sentido almacenar información de roles en la base de datos, ya que los usuarios ya están separados en 2 dbs por su función.

He aquí algunos pseudo-código:

if (AdminDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'admin'); 
} elseif (UserDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'user'); 
} else { 
    // Login failed. 
} 

Su parte 'ThisSession.AssociateUserWithRole' no sé. Básicamente, uno de los usuarios está autenticado. Necesito decirle a .NET a qué función pertenece el usuario.

Respuesta

15

Implementing a role provider no es particularmente difícil, especialmente si solo está implementando la comprobación de roles, no la gestión de roles. Simplemente implemente las partes que necesita y haga que el resto arroje NotImplementedExceptions. Si solo tiene una aplicación, tampoco debe preocuparse demasiado por esa parte. Tenga en cuenta que las porciones que necesita estarán dictadas por la forma en que el marco lo use, no por cómo lo usaría. Creo que, por ejemplo, tendrá que implementar el bit que devuelve todos los roles del usuario, incluso si solo desea comprobar si tienen un rol específico.

Dicho esto, podría omitir todo el RoleProvider y hacer todo el trabajo en la Sesión.En este caso, implementaría su propio AuthorizeAttribute y reemplazaría sus bits de autentificación y verificación de funciones con los suyos propios. Almacene el rol del usuario en la sesión una vez autenticado y revíselo allí utilizando su atributo y los parámetros proporcionados al atributo para el método/clase con el que lo ha decorado.

+0

El CustomizeAttribute personalizado tiene más sentido para mí (un novato .NET MVC de PHP-land). ¡¡Gracias por la ayuda!! –

+0

¿Es tu media el uso de 'Session' como esta ?: en login->' Session.Add ("LoggedInRole", "admin"); 'y cuando necesito el tipo de usuario actual, léelo de' Session'. ¿'Sesión' es lo suficientemente segura para guardar el tipo de usuario (función) en ella? –

+1

@MajidR 'Session' es típicamente todo del lado del servidor por lo que no es menos seguro que el proveedor de roles, desde una perspectiva de intrusión. Obviamente, usted debe codificar toda la lógica usted mismo, así que, desde una perspectiva de robustez, dependerá. Probablemente iría a la ruta 'RoleProvider'. – tvanfosson

6

Si está utilizando el número de miembros & funciones integradas en asp.net continuación, busque en la AddUserToRole y RemoveUserFromRole:

http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx

Sobre la base de cómo se inicia sesión puede agregar y quitar según sea necesario.

No pude decir por su publicación si no está utilizando el proveedor de roles o si estaba diciendo que no quería crear su propio proveedor de roles. Si no está utilizando el proveedor de roles incorporado, tendrá que usar el mecanismo de codificación que tenga para cambiar al usuario al iniciar sesión en función de cómo y desde dónde inicia sesión.

EDITAR: Ahora que ha mostrado su código y ha declarado que no está utilizando el motor de roles asp.net.

Está utilizando la cookie de autenticación de formularios que aparece para anular la autenticación del archivo global.asax y configurar las funciones según sea necesario y crear su ticket.

He aquí una muestra en: http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html

La muestra única "entiende" los papeles pero se puede añadir/cambiar los papeles aquí.

+0

creo @ solución de tvanfosson funcionaría mejor para lo que necesito. ¡Gracias por la ayuda! Lo aprecio. –

2

creo que este artículo (aunque a partir de 2003) describe con claridad el proceso de asignación de roles a un usuario, y la sustitución del director en cada petición (similar a lo que hace NerdDinner):

autorizar a los usuarios con seguridad basada en funciones : http://msdn.microsoft.com/en-us/library/aa289844%28v=vs.71%29.aspx

1

Si alguien se encuentra con el mismo problema con OWIN, supongo que esto puede ayudar:

var identityResult = await manager.CreateIdentityAsync(login, "MyAppCookie"); 

if (<user is admin>) 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "Admin")); 
else 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "User")); 

HttpContext.Current.GetOwinContext().Authentication.SignIn(identityResult); 
Cuestiones relacionadas