FormsAuthenticationTicket用户数据加密后仍然可读(asp.net MVC3与表单认证)



我正在用新的ASP建立一个网站。. NET mvc框架和使用formsa。确保网站安全。我将用户的角色存储在FormsAuthenticationTicket的UserData属性中(手动设置cookie),然后在将票据添加到cookie之前调用票据上的encrypt方法(参见下面的标准票据片段)。

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,它能够检查用户是否为1。认证和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在将其添加到响应cookie之前加密得很好。

但是,当我检查AuthorizeCore方法时,控制器(索引页)被调用,参数获取,HttpContext,包含所有未加密的票据,所以没有必要再解密票据时读取cookie。

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

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

谢谢。

Forms auth需要在页面处理管道的早期对cookie进行解密,以确定用户是否获得授权——此时它将为user填充详细信息。身份,等。

最新更新