我正在使用FormsAuthentication编写ASP.net MVC 5应用程序。我使用FormsAuthentication.SetAuthCookie(user.Email, model.RememberMe)
完成了一切并正常工作。
但是,我想创建一个自定义票证,这样我就可以在票证的UserData字段中存储一些额外的信息。这就是我创建故障单并将其存储在cookie中的方式:
var ticket = new FormsAuthenticationTicket(1, user.Email, DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes), model.RememberMe, user.AuthToken);
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Domain = FormsAuthentication.CookieDomain, Path = FormsAuthentication.FormsCookiePath, HttpOnly = true, Secure = FormsAuthentication.RequireSSL };
HttpContext.Response.Cookies.Add(cookie);
这会创建一个加密的故障单并将其发送到浏览器。我已经通过开发人员工具和Fiddler验证了该票证是否存在于浏览器中,并且在后续请求中将其发送回服务器。
但身份验证现已破裂。此外,Cookie在Application_AuthenticateRequest
或Application_PostAuthenticateRequest
个事件中不可用。当我使用调试器来探索Context.Request.Cookies
时,它不在列表中。
奇怪的是,如果我退回管道并在Application_BeginRequest
中检查它,那么cookie确实存在:
void Application_BeginRequest(object sender, EventArgs e)
{
// Auth cookie exists in the collection here! Ticket decrypts successfully
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null)
return;
var encTicket = authCookie.Value;
var ticket = FormsAuthentication.Decrypt(encTicket);
}
void Application_AuthenticateRequest(object sender, EventArgs e)
{
// Auth cookie missing from the cookies collection here!
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null)
return;
var encTicket = authCookie.Value;
var ticket = FormsAuthentication.Decrypt(encTicket);
using (var db = new BadgerContext())
{
var user = db.Users.OfType<RegisteredUser>().FirstOrDefault(x => x.UserName == ticket.Name);
if (ticket.UserData != user.AuthToken)
{
FormsAuthentication.SignOut();
Response.Redirect(FormsAuthentication.DefaultUrl);
}
}
}
因此,在BeginRequest
之后AuthenticateRequest
之前,某些内容正在从Cookie中剥离我的自定义FormsAuthenticationTicket。不幸的是,这会破坏网站上的身份验证。
创建自定义故障单时,是什么原因造成了这种行为?我的cookie创建有问题吗?
答案 0 :(得分:6)
检入。system.web
节点内的.config文件,httpRuntime
标记。
<httpRuntime targetFramework="4.5" />
与主网站相同
答案 1 :(得分:0)
Rowan建议我查看FormsAuthentication.Timeout.Minutes
的值。经过调查,此值始终返回0
。这导致票证立即到期。我不得不使用FormsAuthentication.Timeout.TotalMinutes
而一切都开始正常工作