这可能是一个有点无知的问题,但我是 mvc 新手,所以很抱歉!
我研究了 Nerd 晚餐身份验证模型,但在我的应用程序中,我有一个复杂的基于角色的身份验证。所以我所做的是:
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;
}
}
}
登录时,我使用 FormsAuth 验证用户名/密码,然后创建 cookie。
这里的问题是每次创建自定义身份时,我都必须在数据库中查询用户角色。是否有一个正确的方法来解决这个问题,或者我是否在对每个传入请求查询数据库时做正确的事情?我应该将角色列表保存在 cookie 或其他东西中吗?
我也不太明白 forms auth 如何处理身份验证的整个生命周期?我使用与 Nerd 晚餐用户相同的 IFormsAuthentication
设计模式,并且在登录期间我调用 FormsAuth.SignIn()
,后者又调用 FormsAuthentication.SetAuthCookie
code>, 它什么时候成功调用 membershipservice.validateuser()
方法?另外,如果auth cookie已设置,为什么 Nerd 晚餐会创建一个票证,然后将其添加到请求中,然后在PostAuthenticationRequest
期间读取它以检查它是哪个用户。工单操作是否像 session 一样?
谢谢!圣诞快乐!
<小时/>更新:This link让我对表单例份验证票证有了更好的理解。
最佳答案
“正确吗?”这是一个见仁见智的问题。
我想说,如果您没有遇到此查询导致的数据库性能问题,那么不必担心。
如果是,您可以将身份验证代码集中到某种身份验证提供程序或类型中,并将身份验证信息缓存在内存中,直到写入更新数据库,这会同时使缓存失效。
(你的第二个问题本身就很好;我没有足够的信息来回答它。)
关于asp.net-mvc - 在每个请求上使用基于角色的自定义身份验证查询数据库的正确方法 ASP.NET MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4531287/