3

我有以下代码:

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

4 回答 4

0

票据存储在 cookie 中。当您在 cookie 过期后访问页面时,您的代码会发生什么?

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

于 2009-02-22T18:06:45.433 回答
0

FormsAuthentication 本身不会将任何内容放入您的 UserData。值得在您处理票证创建(以及创建用户数据)的位置附近放置一个断点并跟踪它所采用的路径。

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

如果您使用的是 Firefox,我建议您使用“Add N Edit Cookies”插件:https ://addons.mozilla.org/en-US/firefox/addon/573

于 2009-02-22T18:15:34.540 回答
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");
    }

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

于 2009-02-23T12:56:13.020 回答
0

我正在搜索相同的问题并发现我使用“FormsAuthentication.RedirectFromLoginPage”添加cookie的问题。我变成了“response.cookies.add”。及其工作。

于 2009-08-18T05:39:35.347 回答