3

这可能是一个有点无知的问题,但我是 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;
                }
            }
        }

在登录时,我使用 FormsAuth 验证用户名/密码,然后创建 cookie。

这里的问题是每次创建自定义身份时,我都必须在数据库中查询用户角色。有没有解决这个问题的正确方法,或者我是否在做正确的事情来查询每个传入请求的数据库?我应该将角色列表保存在 cookie 中吗?

我也不太了解表单身份验证如何处理身份验证的整个生命周期?我使用与IFormsAuthentication书呆子晚餐用户相同的设计模式,并且在登录期间我调用FormsAuth.SignIn()它依次调用FormsAuthentication.SetAuthCookie,它何时设法调用该membershipservice.validateuser()方法?此外,如果已设置身份验证 cookie,为什么 nerd Dinner 会创建票证,然后将其添加到请求中,然后在期间读取它PostAuthenticationRequest以检查它是哪个用户。票务操作是否像会话?

谢谢!圣诞节快乐!


更新这个链接让我对表单身份验证票有了更好的理解。

4

2 回答 2

3

“正确的?” 这是一个见仁见智的问题。

我想说,如果您没有遇到由该查询引起的数据库性能问题,那么不要担心。

如果您是,您可以将您的身份验证代码集中到某种身份验证提供程序或类型中,并将身份验证信息缓存在内存中,直到写入更新数据库,这应该同时使缓存无效。

(您的第二个问题本身会做得很好;我没有足够的信息来回答它。)

于 2010-12-25T19:40:34.357 回答
2

另一种方法是在对用户进行身份验证时将用户的角色存储在身份验证票证中。然后对于每个请求(Application_AuthenticateRequestglobal.asax 文件的方法),您可以从身份验证票证中提取角色并创建一个GenericPrincipal.

有关更多详细信息,请参阅此答案

于 2010-12-26T12:08:50.903 回答