我有完全相同的要求。我有自己的用户和角色架构,不想迁移到 ASP.NET 成员架构,但我确实想使用 ASP.NET MVC 操作过滤器来检查授权和角色。我必须做大量的挖掘才能找出到底需要做什么,但最终相对容易。我会省去你的麻烦并告诉你我做了什么。
1)我创建了一个派生自System.Web.Security.MembershipProvider的类。 MembershipProvider 有大量抽象方法,用于各种与身份验证相关的功能,例如忘记密码、更改密码、创建新用户等。我想要的只是能够根据我自己的模式进行身份验证。所以我的类主要包含空覆盖。我刚刚覆盖了 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)我创建了一个派生自System.Web.Security.RoleProvider的类。同样,我只是对所有我不需要的东西(例如创建和更改角色)进行了空实现。我只是重写了两种方法:
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)然后我将这两个类插入我的 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>
就是这样。默认授权操作过滤器将使用这些类。您仍然需要处理登录页面的登录和注销。只需像平常一样使用标准表单身份验证类即可。