我刚刚从VS2010升级到VS 2012,并且在FormsAuthentication方面遇到了一些问题。
我有一些旧代码可以创建一个自定义身份验证cookie来存储som信息:
public static int SetAuthCookie<T>(this HttpResponse responseBase, string name, bool rememberMe, T userData)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
var cookie = FormsAuthentication.GetAuthCookie(name, rememberMe);
var ticket = FormsAuthentication.Decrypt(cookie.Value);
var newTicket = new FormsAuthenticationTicket(ticket.Version,
ticket.Name,
ticket.IssueDate,
ticket.Expiration,
ticket.IsPersistent,
serializer.Serialize(userData),
ticket.CookiePath);
var encodedTicket = FormsAuthentication.Encrypt(newTicket);
cookie.Value = encodedTicket;
responseBase.Cookies.Add(cookie);
return encodedTicket != null ? encodedTicket.Length : 0;
}
}
升级到.Net 4.5后,HttpContext.Current.Request.IsAuthenticated始终为null。我已经看到有一种在.Net 4.5中进行身份验证的新方法,但我宁愿不使用它,因为我无法从.Net 4.0升级生产环境。有没有办法在使用自定义身份验证cookie时设置身份验证?
答案 0 :(得分:4)
我必须自己在Global.asax中设置当前用户:
private void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(ticket), new string[0]);
}
}
为什么在.Net 4.5中这已经发生了变化我不知道。
答案 1 :(得分:1)
听起来你正面临着这些问题之一:
http://social.microsoft.com/Forums/en-US/Offtopic/thread/1791c5e3-4087-4e92-a460-51c5c4221f49
或更简单的配置:
http://forums.asp.net/t/1835788.aspx/1
或者破坏了web.config,如下所示:
答案 2 :(得分:1)
在.NET 4.5中,machineKey的处理方式不同。您可以在您的配置中添加compatibilityMode =“Framework20SP1”:
(以上是2.0 / 4.0应用程序的默认设置,但不是4.5应用程序的默认设置,因此必须在4.5应用程序中明确设置。)