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

Joh*_*ann 17 c# asp.net cookies asp.net-mvc owin

我们有一个使用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")
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Bri*_*iec 16

身份验证选项包含一个名为的属性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);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

ExpiresUtc如果您真的想要,您甚至可以设置登录呼叫,但最好将该逻辑留在身份验证提供程序中,以便更容易管理.