【问题标题】:ASP.NET: How to get FormsAuthenticationTicket object when authentication expiredASP.NET:身份验证过期时如何获取 FormsAuthenticationTicket 对象
【发布时间】:2010-12-20 16:51:18
【问题描述】:

我正在尝试检查用户当前 FormsAuthenticationTicket 的 Expired 属性,以查看身份验证期限是否已过期。但是当期限到期时,我永远无法获得足够的信息来创建要检查的票证。我试过这个:

FormsIdentity id = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;

但当认证期限到期时,用户为空。所以这行不通。我试过这个:

HttpCookie authCookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);

但是当认证期限到期后,Forms Cookie 就消失了,这意味着 authCookie 将为空。所以这行不通。

有什么方法可以在身份验证期到期时真正获取 FormsAuthenticationTicket 对象?必须有,因为对象中有一个“过期”属性。我错过了什么?

谢谢。

【问题讨论】:

    标签: asp.net cookies forms-authentication formsauthenticationticket


    【解决方案1】:

    假设浏览器(仅限 IE)没有删除过期的 cookie,ASP.Net 似乎从 Request.Cookies 集合中删除了过期的身份验证 ticket。它仍然存在于 Request.Header["Cookie"] 中,但在 cookie 集合中不可用。我相信这发生在“BeginRequest”和“AuthenticateRequest”事件之间的某个时间。我遇到了同样的问题,我自己正在进一步探索。

        void context_BeginRequest(object sender, EventArgs e)
        {
            string cookie = ((HttpApplication)sender).Context.Request.Cookies[".ASPXFORMSAUTHSS"].Value;
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie);
        }
    

    【讨论】:

    【解决方案2】:

    客户端浏览器在标头中遗漏了过期的 cookie。所以没有检索它的代码隐藏方法,因为客户端永远不会把它给你。出于某种目的,可能使用 javascript cookie 来检索原始 cookie 数据并将其放入 post 标头或 AJAX 调用中,但我相信 javascript cookie 机制与浏览器具有相同的过期限制。过期的 cookie 不再有效,因此无法访问。

    【讨论】:

    • 我猜cookie的过期属性只有在客户端的日期/时间无效时才有效。
    • 我相信这个答案有点误导。身份验证票据的过期时间实际上与 cookie 的过期时间不同。 cookie 的创建是一个单独的调用,虽然通常使用相同的过期期限,但您可以不同地设置它们。我还没有验证,但我相信 Tim Irwin 是正确的,即 ASP.NET 如果检测到过期票证就会删除 cookie。
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2018-05-10
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多