是否可以按用户设置 ASP.NET Owin 安全 cookie 的 ExpireTimeSpan?
Posted
技术标签:
【中文标题】是否可以按用户设置 ASP.NET Owin 安全 cookie 的 ExpireTimeSpan?【英文标题】:Is it possible to set an ASP.NET Owin security cookie's ExpireTimeSpan on a per-user basis? 【发布时间】:2015-04-07 05:11:01 【问题描述】:我们有一个使用 Owin cookie 身份验证的 ASP.NET MVC 5 应用程序。目前,我们设置cookie认证如下:
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 应用程序级别执行,我们的应用程序是多租户的。有谁知道在身份验证期间或通过在某处覆盖 Owin 管道事件来为每个用户设置用户会话的 ExpireTimeSpan 的方法?
提前致谢!
【问题讨论】:
【参考方案1】:身份验证选项包含一个名为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
,不过最好将该逻辑留在身份验证提供程序中,以便于管理。
【讨论】:
ExpiresUtc 似乎对我不起作用,尽管这看起来很有希望。 我对它的工作原理有点困惑;具体来说,这种方法提供了一个滑动到期,我不明白这是怎么可能的。 OnResponseSignIn 仅在登录时调用一次,并且 ExpiresUtc 设置为特定的时钟时间。因此,如果我在 12:01 登录,ExpiresUtc 会设置为 12:16...但是如果我在 12:05 发出请求,尽管 OnResponseSignIn 中的断点不会再次被击中,但我的登录不会在 12:16 过期但有效期至 12:20。尽管有后续请求,我的 cookie 仍应显示 12:16,那怎么可能? @Grank cookie 中间件处理调整过期时间。因此,如果您将SlidingExpiration
和AllowRefresh
设置为true
,那么中间件将计算会话持续时间,并从那里推出时间。代码在katanaproject.codeplex.com/SourceControl/latest#src/…中的AuthenticateCoreAsync
方法中
这个方法确实有效,因为 AuthenticationProperties
字典被序列化到 cookie 本身,因此当发生刷新并再次调用 OnResponseSignin
时,您将可以访问原始您在登录时设置的值。我使用了与此处描述的机制相同的机制,但我决定在登录时将计算出的过期时间跨度存储在 AuthenticationProperties
字典的自定义条目中。没有理由每次都添加额外的逻辑来计算它。
尽管我很难理解 Katana,但这样的答案让我爱不释手。我希望我可以两次投票赞成这个答案。只有一点,也许值得在尝试读取其值之前检查signInContext.Properties.Dictionary["organization"]
不为空。我在这里抛出了一个异常,但它没有冒泡。还是谢谢!以上是关于是否可以按用户设置 ASP.NET Owin 安全 cookie 的 ExpireTimeSpan?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Identity 2.0 解密 Owin cookie
在 OWIN 托管的 SignalR 实现中接受 ASP.NET 表单身份验证 cookie?
将 Owin / Katana 与 ASP.NET Core(实际用例)一起使用是不是仍然相关?