我使用新的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时,它再次全部未加密。
对于长篇问题/故事感到抱歉,可能有一个简单而简短的答案。 希望我的故事很清楚。
感谢。
答案 0 :(得分:3)
表单身份验证需要在页面处理管道的早期解密cookie,以确定用户是否已获得授权 - 即填写User.Identity的详细信息等。