安装了.NET 4.5后,自定义表单身份验证出现故障。

4

我刚刚从VS2010升级到了VS 2012,现在使用FormsAuthentication时遇到了一些问题。

我有一些旧代码,用于创建一个自定义的授权cookie来存储一些信息:

   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升级生产环境。在使用自定义auth cookie时是否有设置身份验证的方法?


我来自.NET Framework兼容性团队。想更好地了解这个问题。您可以通过发送电子邮件至netfx45compat at Microsoft dot com与我们讨论吗?如果这会影响您的生产情况,我们也很乐意帮助解决它。 - Varun
当然,我会给你打电话。 - Dofs
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 中发生了变化。

你是否找出了发生了什么变化? - eglasius

1

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

(上述是2.0 / 4.0应用程序的默认设置,但不是4.5应用程序的默认设置,因此必须在4.5应用程序中明确设置。)
参考资料:http://forums.asp.net/t/1835788.aspx/1

额外提示:这是您的机器密钥的一部分 <machineKey compatibilityMode="Framework20SP1" validationKey="" decryptionKey="" validation="SHA1" decryption="AES" />。另外,请不要忘记需要将验证设置与您的其他版本匹配。 - Jeff

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接