【问题标题】:Form authentication slidingExpiration does not work表单认证slidingExpiration不起作用
【发布时间】:2018-08-21 14:33:41
【问题描述】:

我有以下代码

int intTimeout = (FormsAuthentication.Timeout.Hours * 60) +
  FormsAuthentication.Timeout.Minutes;
var authTicket = new FormsAuthenticationTicket(1, Utility.userCookie, DateTime.Now, 
  DateTime.Now.AddMinutes(intTimeout), true, cookieValue);

string strEncryptedTicket = HttpUtility.UrlEncode(FormsAuthentication.Encrypt(authTicket));
var authCookie = new HttpCookie(Utility.userCookie, strEncryptedTicket);
authCookie.Expires = authTicket.Expiration;
//FormsAuthentication.RedirectFromLoginPage("", false);
authCookie.Secure = FormsAuthentication.RequireSSL;
//authCookie.Secure = true;

HttpContext.Current.Response.Cookies[Utility.userCookie].Expires = authTicket.Expiration;
HttpContext.Current.Response.Cookies[Utility.userCookie].Value = authCookie.Value;

下面web.config

<authentication mode="Forms">
  <forms timeout="2" slidingExpiration="true" requireSSL="true" />
</authentication>

我一直点击页面链接,仍然会在 2 分钟后过期

【问题讨论】:

  • 请提供更多详细信息:1)您托管的 Web 服务器的版本,2)您的 web.config 中的 FormAuthenticationModule 是否有任何更改 3) Utility.userCookie 的值是什么?
  • 你能提供你的 web.config 文件吗??
  • 您在哪里拒绝authCookie 作为响应的一部分?看来您正在创建一个然后永远不会发送回用户。接下来....你确定你没有使用 Identity 框架吗?过去几年创建的任何项目默认情况下都不会使用表单身份验证,因此您在其中放置的任何设置都不会受到身份框架的尊重。
  • 我已经给出了 web.config 的任何与表单身份验证相关的详细信息
  • 你的asp.net版本是多少?

标签: c# asp.net-mvc cookies form-authentication slidingexpiration


【解决方案1】:

请注意web.configcustom forms-based authentication的结构:

<forms 
   name="name" 
   loginUrl="URL" 
   defaultUrl="URL"
   protection="[All|None|Encryption|Validation]"
   timeout="[MM]"
   path="path"
   requireSSL="[true|false]"
   slidingExpiration="[true|false]">
   enableCrossAppRedirects="[true|false]"
   cookieless="[UseUri|UseCookies|AutoDetect|UseDeviceProfile]" 
   domain="domain name"
   ticketCompatibilityMode="[Framework20|Framework40]">
   <credentials>...</credentials>
</forms>

如您所见,timeout 属性的工作时间基于您设置的分钟数 2(例如 2 分钟)。

通常,如果您在 web.config 中启用 slidingExpiration您无需手动重新生成新的 cookie。对于您的情况,我建议您使用跟踪工具,例如提琴手。刷新页面时,可以从 Fiddler 中查看 cookie 过期时间是否被重置。

我在Weird Timeouts With Custom ASPNETFormsAuthentication 找到了一个很好的例子,它可以为你做一些清理工作。

【讨论】:

    【解决方案2】:

    问题可能与 web.config 文件中缺少静态 machineKey 部分有关。当您调用FormsAuthentication.EncryptFormsAuthentication.Decrypt 时,这些方法使用web.config 文件中提供的machineKey 值来执行操作。如果您没有为 machineKey 提供严格的值,则会在 Web 应用程序的起点生成一个新的唯一 validationKeydecryptionKey。有时取决于服务器设置(例如应用程序池设置的小空闲时间值),应用程序在FormsAuthenticationTicket 的到期时间之前终止。在这种情况下,由于新的machineKey 值,Decrypt 方法无法验证票证。我只是建议你设置一个静态 machineKey。

    请参阅以下链接: https://msdn.microsoft.com/en-us/library/w8h3skw9(v=vs.100).aspx

    【讨论】:

      【解决方案3】:

      尝试从您的代码中删除此行并重试:

      HttpContext.Current.Response.Cookies[Utility.userCookie].Expires = authTicket.Expiration;
      

      【讨论】:

        【解决方案4】:

        在 web.config 文件中删除 &lt;clear/&gt; 元素或在 &lt;clear/&gt; 元素后添加以下内容(如果不存在)。

        <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>
        

        【讨论】:

          【解决方案5】:

          在我的应用程序中,我像这样在Startup.cs 中定义cookieAuthenticationOptions,它工作正常

          app.UseCookieAuthentication(new CookieAuthenticationOptions
                      {
                          ExpireTimeSpan = TimeSpan.FromHours(1),
                          SlidingExpiration = true,
                          CookieHttpOnly = true,
                          CookieName = "App.Authentication",
                          AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                          LoginPath = new PathString("/Account/Login"),
                      });
          

          您是否定义了这些选项?

          为什么不使用AuthenticationManagerSignIn 方法?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-22
            • 2017-02-27
            • 2012-07-14
            • 2012-02-08
            • 2011-11-30
            相关资源
            最近更新 更多