我正在用新的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填充详细信息。身份,等。