Tenía exactamente el mismo requisito. Tenía mi propio esquema de usuario y rol y no deseaba migrar al esquema de membresía de asp.net, pero sí quería utilizar los filtros de acción ASP.NET MVC para verificar la autorización y los roles. Tuve que hacer una buena cantidad de excavaciones para averiguar exactamente qué hacer, pero al final fue relativamente fácil. Te ahorraré el problema y te contaré lo que hice.
1) Creé una clase que derivaba de System.Web.Security.MembershipProvider. MembershipProvider tiene una tonelada de métodos abstractos para todo tipo de funciones relacionadas con la autenticación, como la contraseña olvidada, cambiar la contraseña, crear un nuevo usuario, etc. Todo lo que quería era la capacidad de autenticar contra mi propio esquema. Así que mi clase contenía principalmente anulaciones vacías. Yo sólo hizo caso omiso de ValidateUser:
public override bool ValidateUser(string username, string password)
{
if (string.IsNullOrWhiteSpace(username) ||
string.IsNullOrWhiteSpace(password))
return false;
string hash = EncryptPassword(password);
User user = _repository.GetByUserName(username);
if (user == null) return false;
return user.Password == hash;
}
2) He creado una clase que deriva de System.Web.Security.RoleProvider. Nuevamente, tuve implementaciones vacías para todo lo que no necesitaba para crear y cambiar roles. Yo sólo hizo caso omiso de dos métodos:
public override string[] GetRolesForUser(string username)
{
User user = _repository.GetByUserName(username);
string[] roles = new string[user.Role.Rights.Count + 1];
roles[0] = user.Role.Description;
int idx = 0;
foreach (Right right in user.Role.Rights)
roles[++idx] = right.Description;
return roles;
}
public override bool IsUserInRole(string username, string roleName)
{
User user = _repository.GetByUserName(username);
if(user!=null)
return user.IsInRole(roleName);
else
return false;
}
3) Entonces conecté estas dos clases en mi web.config:
<membership defaultProvider="FirstlookMemberProvider" userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="FirstlookMemberProvider" type="FirstlookAdmin.DomainEntities.FirstlookMemberProvider, FirstlookAdmin" />
</providers>
</membership>
<roleManager defaultProvider="FirstlookRoleProvider" enabled="true" cacheRolesInCookie="true">
<providers>
<clear/>
<add name="FirstlookRoleProvider" type="FirstlookAdmin.DomainEntities.FirstlookRoleProvider, FirstlookAdmin" />
</providers>
</roleManager>
Eso es todo. Los filtros de acción de autorización predeterminados usarán estas clases. Aún tendrá que gestionar el inicio de sesión de la página de inicio de sesión y cerrar la sesión. Simplemente use las clases de autenticación de formularios estándar para esto como lo haría normalmente.
+1. Personalizar el proveedor es una forma correcta de hacerlo. Gracias por señalar que tampoco es necesariamente mucho trabajo. –
Oh, vale la pena señalar que la contraseña realmente debería ser salada con un nonce antes de hash, sin embargo. –
Lamento revivir esto y molestarlo, pero ¿es posible obtener más información sobre su solución? Estoy un poco confundido sobre cómo hiciste la gestión del rol. – Ciel