在每个请求ASP.NET MVC上拥有基于角色的自定义验证数据库的正确方法
题
这可能是一个有点无知的问题,但我是MVC的新手,所以我很抱歉!
我研究了书呆子晚餐验证模型,但在我的应用程序中,我具有复杂的基于角色的身份验证。所以我要做的是:
void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
HttpCookie authCookie = HttpContext.Current.Request
.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
string encTicket = authCookie.Value;
if (!String.IsNullOrEmpty(encTicket))
{
FormsAuthenticationTicket ticket =
FormsAuthentication.Decrypt(encTicket);
CustomIdentity id = new CustomIdentity(ticket.Name);
GenericPrincipal prin = new GenericPrincipal(id, id.Roles);
HttpContext.Current.User = prin;
}
}
}
在登录中,我用foldauth身份验证用户名/通过,然后创建cookie。
这里的问题是 每次创建自定义身份时,我都必须 查询数据库中的用户角色. 。有没有 正确的 解决这个问题,还是我正在做正确的事情来查询每个传入请求的数据库?我应该将角色列表保存在cookie之类的地方吗?
我也不真正了解形式Auth如何处理身份验证的整个生命周期?我使用同样的 IFormsAuthentication
设计模式是书呆子的晚餐用户以及我在登录期间打电话 FormsAuth.SignIn()
反过来呼叫 FormsAuthentication.SetAuthCookie
, ,什么时候设法致电 membershipservice.validateuser()
方法 ??也是 auth cookie已设置 为什么书呆子晚餐会创建票,然后将其添加到请求中,然后在期间阅读 PostAuthenticationRequest
检查它是哪个用户。票务操作像会话一样吗?
谢谢!圣诞节快乐!
更新 : 这个链接 让我对表格身份验证票的理解稍微更好。
解决方案
另一种方法是在用户身份验证时将用户的角色存储在身份验证票证中。然后每个请求(Application_AuthenticateRequest
global.asax文件的方法)您可以从身份验证票中提取角色并创建一个 GenericPrincipal
.
看到这个答案 更多细节。
其他提示
“正确的?”这是一个意见问题。
我会说,如果您不遇到此查询引起的数据库性能问题,那就不用担心。
如果是,则可以将身份验证代码集中到某种Auth提供商或类型中,并在内存中缓存身份验证信息,直到写入更新数据库,该数据库应同时使缓存无效。
(您的第二个问题会自己做得很好;我没有足够的信息来回答。)