FormsAuthenticationTicket Userdata在加密后仍然可读(具有表单身份验证的asp.net MVC3)

时间:2011-12-17 18:48:41

标签: asp.net-mvc asp.net-mvc-3

我使用新的ASP.NET MVC3框架构建一个网站并使用FormsAuth。保护网站。我将用户的角色存储在FormsAuthenticationTicket的UserData属性中(手动设置cookie),然后在将其添加到cookie之前调用该票证上的encrypt方法(参见下面的标准票据片段)。 p>

if (Validate(model.UserName, model.Password))
                {                     
                    FormsAuthenticationTicket authTicket =  new FormsAuthenticationTicket(1,
                            model.UserName,
                            DateTime.Now,
                            DateTime.Now.AddMinutes(30),
                            false,
                            UserType.Administrator.ToString());
                    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
                    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
                    Response.Cookies.Add(faCookie);   
                    return RedirectToAction("startpage", "mycontroller");
                }
            }     

现在我已经制作了一个自定义AuthorizeAttribute,它能够检查用户是否已经过身份验证,并且2.具有管理员角色(来自故障单)。 (下面) 当一个动作在具有属性注释的类中发生时,将调用此派生类的AuthorizeCore方法。

protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }
            IPrincipal user = httpContext.User;
            if (!user.Identity.IsAuthenticated)
            {
                return false;
            }
            string cookieName = FormsAuthentication.FormsCookieName;
            HttpCookie authCookie = httpContext.Request.Cookies[cookieName];
            if (authCookie == null)
                return false;

            FormsAuthenticationTicket authTicket =       FormsAuthentication.Decrypt(authCookie.Value);
            if (authTicket.UserData != UserType.Administrator.ToString())
                return false;
            return true;

所以这里我很困惑。

当我按照正在执行的代码(使用有效凭据,在调试中),并检查每行上所做变量的值时,encryptedTicket会在将其添加到reponsecookie之前加密。

但是当我在调用控制器(索引页面)时检查AuthorizeCore方法时,它获取的参数HttpContext包含未加密所有内容的票证,因此不再需要解密票证了。读cookie。

为什么我会在登录控制器中成功加密该票据,然后将其发送回客户端,但是当我在AuthorizeAdministrator类中收到httpcontext时,它再次全部未加密。

对于长篇问题/故事感到抱歉,可能有一个简单而简短的答案。 希望我的故事很清楚。

感谢。

1 个答案:

答案 0 :(得分:3)

表单身份验证需要在页面处理管道的早期解密cookie,以确定用户是否已获得授权 - 即填写User.Identity的详细信息等。