用户已通过身份验证但缺少Ticket.UserData

时间:2009-02-21 08:53:48

标签: c# asp.net forms-authentication

我有以下代码:

if (HttpContext.Current.Request.IsAuthenticated == false)
{
    // this isn't reached so i know user is Authenticated
    return;
}
FormsIdentity fIdentity = HttpContext.Current.User.Identity as FormsIdentity;
string[] delimitedUserData = fIdentity.Ticket.UserData.Split('|');
// but at this point delimitedUserData.Length is 0

关于什么会导致身份验证票证有效但UserData消失的想法?

我的程序通常运行正常,所有UserData都可以轻松访问。但每隔一段时间我就会进入UserData不存在的状态。

4 个答案:

答案 0 :(得分:0)

故障单存储在cookie中。在cookie过期后访问页面时代码会发生什么?

另请注意,User.Identity.IsAuthenticated开箱即可返回true,因此该属性可能不是测试的最佳选择?

答案 1 :(得分:0)

FormsAuthentication本身并没有在UserData中添加任何内容。值得在您处理故障单创建(以及创建UserData)和跟踪所需路径的位置附近设置一个断点。

由于您的错误是间歇性的,因此可能很难强制它触发。一个开始的地方可能是追踪它如何处理cookie过期,或者当cookie无效时。

如果您使用的是Firefox,我建议使用“添加N编辑Cookie”插件:https://addons.mozilla.org/en-US/firefox/addon/573

答案 2 :(得分:0)

不确定这是否是最好的方法,因为我对asp.net还不太新,但我在登录时这样做的方法是设置一个会话值,我可以在以后的页面中检查 - 这样,如果缺少cookie,我应该无法获取值,因此我可以转移到登录页面。

所以,在登录后直接(在_LoggedIn事件中),我这样做:

        // write ClientID to the session
        Session.Add("ClientID", lClientID);

然后在登录后面的每个页面的加载上,我这样做:

if (User.Identity.IsAuthenticated == false || Convert.ToInt32(Session["ClientID"]) == 0)
    {
        Server.Transfer("Login.aspx");
    }

到目前为止,它对我来说效果很好。

答案 3 :(得分:0)

我正在寻找同样的问题并找到我用过的问题 “FormsAuthentication.RedirectFromLoginPage”添加cookie。我改成了“response.cookies.add”。和它的工作。