J'avais exactement la même exigence. J'avais mon propre schéma d'utilisateurs et de rôles et je ne voulais pas migrer vers le schéma d'adhésion asp.net mais je voulais utiliser les filtres d'action ASP.NET MVC pour vérifier les autorisations et les rôles. J'ai dû faire pas mal de recherches pour savoir exactement ce qu'il fallait faire, mais finalement, c'était relativement facile. Je vais vous épargner la peine et vous dire ce que j'ai fait.
1) J'ai créé une classe dérivée de System.Web.Security.MembershipProvider. MembershipProvider a une tonne de méthodes abstraites pour toutes sortes de fonctions liées à l'authentification comme le mot de passe oublié, le changement de mot de passe, la création d'un nouvel utilisateur, etc. Tout ce que je voulais, c'était la possibilité de m'authentifier par rapport à mon propre schéma. Donc ma classe contient principalement des surcharges vides. J'ai juste surchargé 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) J'ai créé une classe dérivée de System.Web.Security.RoleProvider. Encore une fois, j'avais juste des implémentations vides pour toutes les choses dont je n'avais pas besoin comme la création et le changement de rôles. J'ai juste surchargé deux méthodes :
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) J'ai ensuite inséré ces deux classes dans mon 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>
C'est ça. Les filtres d'action d'autorisation par défaut utiliseront ces classes. Vous devrez toujours gérer l'ouverture et la fermeture de la page de connexion. Pour cela, utilisez les classes d'authentification des formulaires standard comme vous le feriez normalement.