会话超时不会在 Azure Redis 缓存会话状态提供程序中滑动

Session timeout is not sliding in Azure Redis Cache Session State Provider

通过多个实例横向扩展 Web 应用程序是 Azure 云的最大优势之一。为了实现对我们的 Web 角色云应用程序的多 VM 支持,我们正在实施 Azure Redis 缓存。我们使用 RedisSessionStateProvider 提供程序来维护会话状态。以下是 web.config 文件中会话管理的配置设置。

<authentication mode="Forms">
  <forms loginUrl="~/Login" slidingExpiration="true" timeout="20" defaultUrl="~/Default" />
</authentication>
<sessionState timeout="20" mode="Custom" customProvider="MySessionStateStore">
  <providers>
     <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider"
        host = "dummy.redis.cache.windows.net" 
        port = "6380" 
        accessKey = "dummysecretkey" 
        ssl = "true" 
        throwOnError = "true" 
        retryTimeoutInMilliseconds = "5000" 
        databaseId = "0" 
        applicationName = "" 
        connectionTimeoutInMilliseconds = "5000" 
        operationTimeoutInMilliseconds = "1000" 
        connectionString = ""/>  
  </providers>

我们的问题是会话超时不会随着用户的回发而延长,假设我们的用户在 10:00 AM 登录应用程序,那么他的会话数据将在绝对 10:20 AM 过期。如果用户在 10:15 AM 回发,那么会话应该在 10:35 AM 过期,但这并没有发生,它绝对在 10:20 AM 过期。

登录按钮点击事件代码如下

 protected void Button1_Click(object sender, EventArgs e)
 {
   FormsAuthentication.SetAuthCookie(TextBox1.Text.Trim(), true);
   ConnectionMultiplexer connection = ConnectionMultiplexer.Connec("dummy.redis.cache.windows.net,ssl=true,password=dummysecretkey");
   IDatabase cache = connection.GetDatabase();
   Session["UserName"] = TextBox1.Text;
   Response.Redirect("Default.aspx");
 }

如果能让我知道需要做什么才能在滑动模式下获得会话超时,我将不胜感激。 最好的问候,

H.R亚达夫

您必须自己重置密钥(加载后):

bool KeyExpire(RedisKey key, DateTime? expiry, CommandFlags flags = CommandFlags.None);
bool KeyExpire(RedisKey key, TimeSpan? expiry, CommandFlags flags = CommandFlags.None);

感谢您报告问题。我们发布了新版本的 RedisSessionStateProvider NuGet 包,修复了上述报告的错误。

https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.5.0

编辑: 我们又发现了一个问题。 ASP.NET 不会为 AJAX 请求调用 ResetItemTimeout,其他会话状态方法有责任滑动会话超时。我们修复了这个错误并发布了一个新的 NuGet 包:https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.6.5

让我们知道这是否解决了您的问题?

我解决了滑动过期的问题,包括 global.ascx.cs

中的以下几行
protected void Application_AcquireRequestState()
{
    if (HttpContext.Current.Session != null)
    {
        RedisSessionStateProvider redis = new RedisSessionStateProvider();
        redis.ResetItemTimeout(HttpContext.Current, HttpContext.Current.Session.SessionID);
    }
}