Можно ли установить cookie ExpeenTimeSpan безопасности ASP.NET Owin для каждого пользователя?

У нас есть приложение ASP.NET MVC 5 с использованием аутентификации cookie Owin. В настоящее время мы настраиваем аутентификацию 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, и наше приложение является многопользовательским. Кто-нибудь знает способ установки ExpireTimeSpan пользовательского сеанса для каждого пользователя либо во время аутентификации, либо путем переопределения события конвейера Owin где-нибудь?

Спасибо заранее!

Ответ 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 во входной вызов, если хотите, хотя лучше всего оставить эту логику в поставщике проверки подлинности, чтобы упростить управление.