是否可以按用户设置 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 中间件处理调整过期时间。因此,如果您将SlidingExpirationAllowRefresh 设置为true,那么中间件将计算会话持续时间,并从那里推出时间。代码在katanaproject.codeplex.com/SourceControl/latest#src/…中的AuthenticateCoreAsync方法中 这个方法确实有效,因为 AuthenticationProperties 字典被序列化到 cookie 本身,因此当发生刷新并再次调用 OnResponseSignin 时,您将可以访问原始您在登录时设置的值。我使用了与此处描述的机制相同的机制,但我决定在登录时将计算出的过期时间跨度存储在 AuthenticationProperties 字典的自定义条目中。没有理由每次都添加额外的逻辑来计算它。 尽管我很难理解 Katana,但这样的答案让我爱不释手。我希望我可以两次投票赞成这个答案。只有一点,也许值得在尝试读取其值之前检查signInContext.Properties.Dictionary["organization"] 不为空。我在这里抛出了一个异常,但它没有冒泡。还是谢谢!

以上是关于是否可以按用户设置 ASP.NET Owin 安全 cookie 的 ExpireTimeSpan?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OWIN ASP.NET MVC5 中注销用户

ASP.NET Identity 2.0 解密 Owin cookie

在 OWIN 托管的 SignalR 实现中接受 ASP.NET 表单身份验证 cookie?

将 Owin / Katana 与 ASP.NET Core(实际用例)一起使用是不是仍然相关?

Owin/Katana - 与 ASP.NET 请求生命周期集成

Asp.Net MVC 5 Owin Twitter Auth 抛出 401 异常