长时间潜伏者第一次海报。
尝试为 MVC 实现简单的自定义角色和成员资格提供程序。
已实现角色和成员资格提供程序类,并将它们挂接到我的 web.config 中。 添加了代码以根据自定义数据库验证我的用户,它工作正常。
但是,我不喜欢我的角色提供程序在每个请求上命中数据库的方式,因此我添加了一些代码来尝试从身份验证票证中读取此代码,如下所示:
自定义角色提供程序:
public override string[] GetRolesForUser(string username)
{
if (HttpContext.Current.User != null)
{
return ((UserPrincipal)HttpContext.Current.User).Roles.ToArray();
}
else
{
UserPrincipal user = orchestrator.GetUserByLoginID(username);
return user.Roles.ToArray();
}
}
然后我在 global.asax 中添加了这段代码,以使用自定义用户主体对象将角色和其他一些有用的用户信息保存到 cookie 中:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
JavaScriptSerializer serializer = new JavaScriptSerializer();
UserPrincipalModel userFromTicket = serializer.Deserialize<UserPrincipalModel>(authTicket.UserData);
UserPrincipal newUser = new UserPrincipal();
newUser.UserId = userFromTicket.UserId;
newUser.FullName = userFromTicket.Fullname;
newUser.Email = userFromTicket.Email;
newUser.Roles = userFromTicket.Roles;
newUser.Identity = new GenericIdentity(userFromTicket.Username);
HttpContext.Current.User = newUser;
}
}
我的用户主体类:
public class UserPrincipal : IPrincipal
{
public UserPrincipal() { }
public UserPrincipal(int userId, string userName, string fullName, string password)
{
UserId = userId;
UserName = userName;
FullName = fullName;
Password = password;
}
public virtual int UserId { get; set; }
public virtual string UserName { get; set; }
public virtual string FullName { get; set; }
public virtual string Email { get; set; }
public virtual string Password { get; set; }
public virtual IEnumerable<string> Roles { get; set; }
public virtual IIdentity Identity { get; set; }
public virtual bool IsInRole(string role)
{
if (Roles.Contains(role))
{
return true;
}
else
{
return false;
}
}
//public string[] GetRolesForUser()
//{
// return Roles;
//}
}
但是,当我运行它时,当角色提供程序尝试访问 cookie 中的自定义 UserPrincipal 对象时,我收到以下错误
"无法将类型为'System.Web.Security.RolePrincipal'的对象强制转换为类型'MyApp.Domain.UserPrincipal'"
就像自定义角色提供程序使用自己的特定于角色的主体覆盖存储在票证中的自定义用户主体 im 一样。
只是想知道我试图做的是有缺陷还是有更简单的方法。不想重新发明轮子。
有人得到了一个自定义角色提供程序的示例,该提供程序不会在每个角色请求时命中数据库?
在这里更改它:
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
在这里:
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
基本上,默认角色提供程序的内部工作原理是在设置后设置 HttpContext.Current.User 属性,从而覆盖您所做的操作。
您也可以尝试清除默认角色提供程序,它似乎在 mvc3 和 Web 表单中工作 asp.net 但在 mvc 4 中失败。
<membership>
<providers>
<clear />
</providers>
</membership>
<profile>
<providers>
<clear />
</providers>
</profile>
<roleManager enabled="false">
<providers>
<clear />
</providers>
</roleManager>