4

我刚刚从 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 始终为空。我已经看到在 .Net 4.5 中有一种新的身份验证方法,但我宁愿不使用它,因为我将无法从 .Net 4.0 升级生产环境。使用自定义身份验证 cookie 时有没有办法设置身份验证?

4

3 回答 3

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 中发生了变化,我不知道。

于 2013-04-08T08:22:34.523 回答
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 如下所示:

http://forums.asp.net/t/1852961.aspx/1

于 2013-04-02T11:30:51.047 回答
1

machineKey 在 .NET 4.5 中的处理方式不同。您可以将 compatibilityMode="Framework20SP1" 添加到您的配置中:

(以上是 2.0 / 4.0 应用程序的默认值,但不是 4.5 应用程序的默认值,因此必须在 4.5 应用程序中显式设置。)

参考:http ://forums.asp.net/t/1835788.aspx/1

于 2013-08-27T16:30:31.740 回答