今天我遇到了奇怪的问题。我的网站在 .NET 4 下的应用程序池上运行,今天我们注意到它无法在 IE 10 下对用户进行身份验证(使用其他浏览器一切正常)。这是引发的异常:
“/”应用程序中的服务器错误。
无法将“System.Security.Principal.GenericIdentity”类型的对象转换为“System.Web.Security.FormsIdentity”类型。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.InvalidCastException:无法将“System.Security.Principal.GenericIdentity”类型的对象转换为“System.Web.Security.FormsIdentity”类型。
但是在将 .NET 4 升级到 4.5 版后,错误就消失了。奇怪的是,我们并没有更改应用程序池上 .NET 的版本,它仍然是 .NET 4。
顺便说一句,我正在使用自定义主体,并将 userData 附加到 AuthenticationTicket。这是我来自 Global.asax 的代码:
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
HttpCookie authCooke = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCooke != null)
{
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCooke.Value);
if (authTicket != null)
{
var identity = new GenericIdentity(authTicket.Name, "Forms");
var principal = new CustomPrincipal(identity);
string userData = ((FormsIdentity)(Context.User.Identity)).Ticket.UserData;
var serializer = new JavaScriptSerializer();
principal.User = (User)serializer.Deserialize(userData, typeof(User));
Context.User = principal;
Thread.CurrentPrincipal = principal;
}
}
}
谁能向我解释我做错了什么以及在不更改应用程序池的情况下更新 .NET 版本会如何影响站点?