2

今天我遇到了奇怪的问题。我的网站在 .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 版本会如何影响站点?

4

2 回答 2

0

我的网站上有类似的问题。身份验证仅在 IE10 中失败,但在 Firefox 和 IE8、IE9 中可以正常工作。为了解决这个问题,我在 web.config 中添加了参数 cookieless="UseCookies"

<authentication mode="Forms" >
  <forms loginUrl="~/Account/LogOn" timeout="2880" cookieless="UseCookies" />
</authentication>
于 2013-06-13T13:26:08.183 回答
-3

可能是由于您的代码拼写错误(HttpCookie authCooke)。它应该是“authCookie”吗?

于 2013-03-23T09:32:59.447 回答