encryptedTicket参数的值无效

时间:2013-09-19 13:18:00

标签: asp.net .net asp.net-mvc iis webforms

我最近修改了我的公司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,如Mac OS X; zh-CN)AppleWebKit / 533.17.9(KHTML,类似Gecko)版本/ 5.0.2 Mobile / 8J2 Safari / 6533.18.5

  • eTailInsights标记标识符/ 1.0

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

不同环境的行为也不一致。它对我的本地机器和测试服务器工作正常,但生产失败。这使得排除故障变得困难。

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

搜索此错误导致多个references因Web表单和较新的浏览器版本出现问题。这似乎与我的场景不一致。我没有看到新浏览器的错误,我的网站是MVC。

我发现一个question与我的相似,但没有答案。

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

4 个答案:

答案 0 :(得分: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

            }
        }

这肯定会对你有帮助。

答案 1 :(得分:2)

如果将无效字符串传递给System.Web.Security.FormsAuthentication.Decrypt,则会发生这种情况。最常见的是尝试传递cookieName而不是cookieValue

以下是获取ASPXAUTH cookie值+ info的方法:

string authCookieValue = HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName].Value;
var cookieInfo = System.Web.Security.FormsAuthentication.Decrypt(authCookieValue);

答案 2 :(得分:1)

如果您尝试反序列化的故障单长度太长,则可能会出现同样的错误。

答案 3 :(得分:0)

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

比提出错误更好我只是建议在争论的情况下将用户注销。它并没有解释为什么"为什么"并不完全令人满意(在某些方面"记住我"赢得了为一些用户工作......)但是在至少它可以保持用户的正常行为。

在global.asax中:

using Microsoft.Win32.Interop;

...
...

try {
    ...
    ...
} catch (HttpListenerException e) {
    if (e.ErrorCode == WinError.ERROR_OPERATION_ABORTED) {
        // Do something
    }
}

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

希望这有帮助