是否可以在每个用户的基础上设置ASP.NET Owin安全cookie的ExpireTimeSpan?

问题描述:

我们有一个使用Owin cookie认证的ASP.NET MVC 5应用程序。目前,我们建立了cookie认证如下:是否可以在每个用户的基础上设置ASP.NET Owin安全cookie的ExpireTimeSpan?

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     var timeoutInMinutes = int.Parse(ConfigurationManager.AppSettings["cookie.timeout-minutes"]); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      AuthenticationMode = AuthenticationMode.Active, 
      LoginPath = new PathString("/"), 
      ExpireTimeSpan = TimeSpan.FromMinutes(timeoutInMinutes), 
      SlidingExpiration = true, 
      LogoutPath = new PathString("/Sessions/Logout") 
     }); 
    } 
} 

我们有一个功能请求,让我们的应用程序的管理员在其组织内自定义会话超时。但是,上面的配置代码在MVC应用程序级别执行,我们的应用程序是多租户的。有没有人知道在每个用户的基础上设置用户会话的ExpireTimeSpan的方法,无论是在身份验证期间,还是通过重写某个Owin管道事件?

在此先感谢!

身份验证选项包含一个名为Provider的属性。您可以将其设置为默认提供程序,并使用方法覆盖之一(例如OnResponseSignIn)来修改登录设置,或者也可以实施自己的ICookieAuthenticationProvider并执行相同操作。

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    Provider = new CookieAuthenticationProvider 
    { 
     OnResponseSignIn = signInContext => 
     { 
      var expireTimeSpan = TimeSpan.FromMinutes(15); 

      if (signInContext.Properties.Dictionary["organization"] == "org-1") 
      { 
       expireTimeSpan = TimeSpan.FromMinutes(45); 
      } 

      signInContext.Properties.ExpiresUtc = DateTime.UtcNow.Add(expireTimeSpan); 
     } 
    } 
}); 

您可以检查传入声明以查看应该如何处理会话,也可以将自定义数据添加到登录呼叫中。

context.Authentication.SignIn(new AuthenticationProperties 
{ 
    Dictionary = 
    { 
     { "organization", "org-3" } 
    } 
}, new ClaimsIdentity()); 

您甚至可以设定ExpiresUtc在呼叫符号,如果你真的想要的,但它可能是最好离开这个逻辑在认证供应商,以便更容易管理。

+0

这工作,谢谢! – 2015-02-09 23:52:09

+0

ExpiresUtc似乎不适合我,虽然这看起来很有前途。 – 2015-05-19 14:47:10

+0

我对这是如何工作有点困惑;具体来说,这种方法提供了滑动到期,我不明白这是可能的。 OnResponseSignIn仅在登录时调用一次,并且ExpiresUtc设置为特定的时钟时间。因此,如果我在12:01登录,ExpiresUtc会设置为12:16 ...但如果我在12:05发出请求,虽然OnResponseSignIn中的断点再也不会被再次命中,但我的登录不会在12:16过期但保持有效直到12:20。尽管接下来的请求我的cookie仍然应该说12:16,那么这怎么可能? – Grank 2016-01-28 19:06:04