10

我最近修改了我公司 eComm 网站的登录名,使其具有“保持登录”功能。主要的变化是使这些用户的表单身份验证 cookie 持久化。

更改发布后,我开始在日志中看到此异常:

Invalid value for 'encryptedTicket' parameter
at System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket)

问题似乎是特定于用户代理的。记录错误的唯一用户代理是:

  • Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5

  • eTailInsights 标签标识符/1.0

我有一台上面列出的配置的 iPad。第一次登录尝试有效。但是关闭浏览器并返回站点,从而使用持久 cookie,会导致错误。

这种行为在不同环境中也是不一致的。它适用于我的本地机器和测试服务器,但在生产中失败。这使得故障排除变得困难。

其他版本的 iOS/Safari 可以正常登录。

搜索此错误时发现了几个关于Web 表单和较新浏览器版本问题的参考。不过,这似乎与我的情况不一致。我没有看到新浏览器的错误,我的网站是 MVC。

我发现了一个与我类似的问题,但没有答案。

有人知道这里发生了什么吗?

4

4 回答 4

10

我遇到了同样的问题,这是因为我得到了 authCookieValue 的 null 或空值。所以我的建议是你必须检查 HttpCookie 的 null 以及它的值,如下所示。

HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            //Extract the forms authentication cookie
            if (!string.IsNullOrEmpty(authCookie.Value))
            {
                FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

                string email = authTicket.UserData;

                // and now process your code as per your condition

            }
        }

这一定会帮助你。

于 2014-07-19T05:57:19.993 回答
4

当您尝试反序列化的票证的长度太长时,您可能会遇到相同的错误。

于 2017-09-08T11:59:35.347 回答
2

如果您将无效字符串传递给System.Web.Security.FormsAuthentication.Decrypt. 最常见的是它试图通过cookieName而不是cookieValue.

下面是获取ASPXAUTH cookie值+信息的方法:

string authCookieValue = HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName].Value;
var cookieInfo = System.Web.Security.FormsAuthentication.Decrypt(authCookieValue);
于 2014-03-10T22:40:57.947 回答
1

我发现由于某种原因,cookie 可能会获得不一致的值。对我们来说,在某些情况下,它只是一些用户。

比提出错误更好,我只是建议在出现参数异常的情况下将用户注销。它没有解释“为什么”,并不完全令人满意(在某些方面,“记住我”对某些用户不起作用......)但至少它可以为用户保持正常行为。

在 global.asax 中:

 protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
    {
        HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

        if (authCookie != null)
        {
            try
            {
                var authTicket = FormsAuthentication.Decrypt(authCookie.Value);

                //...
                //setting user properties with cookie...
                //...
            }
            catch (ArgumentException ex)
            {
                FormsAuthentication.SignOut();
                Response.Redirect("/");
            }
        }
    }

甚至不确定是否需要重定向(必须检查)。

希望这可以帮助

于 2015-08-27T14:08:41.067 回答