我使用新的ASP.NET MVC3框架并使用FormsAuth构建网站。用于保护网站。我将用户的角色存储在FormsAuthenticationTicket的UserData属性中(手动设置cookie),然后在将票证添加到cookie之前调用票证上的crypto方法(请参阅下面的标准票证片段)。
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;
所以这就是我感到困惑的地方。
当我跟踪正在执行的代码(在调试中使用有效的凭据),并检查每一行所做的变量的值时,加密的票证会加密,然后再将其添加到reponsecookie中。
但是,当我在调用控制器(索引页)时检查AuthorizeCore方法时,其获取的参数HttpContext包含未加密的票证,因此在读取cookie时不再需要解密票证。
为什么我会在登录控制器中成功地将票证加密,然后将票证发送回客户端,但是当我在AuthorizeAdministrator类中收到httpcontext时,它再次全部未加密。
很长的问题/故事,很抱歉,答案可能很简单。
希望我的故事讲得清楚。
谢谢。
最佳答案
Forms auth需要在页面处理管道的早期对Cookie进行解密,以确定用户是否已获得授权-即在用户填写User.Identity等详细信息时。
关于asp.net-mvc - 加密后仍可读取FormsAuthenticationTicket用户数据(带有表单Auth。的ASP.NET MVC3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8547107/