是否可以为每个用户设置 ASP.NET Owin 安全 cookie 的 ExpireTimeSpan?
Is it possible to set an ASP.NET Owin security cookie's ExpireTimeSpan on a per-user basis?
我们有一个使用 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 的方法?
提前致谢!
身份验证选项包含一个名为 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
,但最好将该逻辑留在身份验证提供程序中,这样更易于管理。
我们有一个使用 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 的方法?
提前致谢!
身份验证选项包含一个名为 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
,但最好将该逻辑留在身份验证提供程序中,这样更易于管理。