Личность выхода пользователя после x часов бездействия - PullRequest
0 голосов
/ 07 января 2019

Мой веб-сайт asp.net MVC использует сеансы и файлы cookie.

Я должен сохранять логин пользователя в течение 15 часов, если роль пользователя - xyz, иначе выйдите из системы через 5 минут бездействия.

Мой код:

web.config

<system.web>
   <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" slidingExpiration="true" cookieless="UseCookies" />
    </authentication>
      <sessionState timeout="5" />
</system.web>

AccountController

public ActionResult Login(LoginModel model)
{
    //validate data
    SignInManager.SignIn(user, true, true); 
    if(userRole = 'xyz')
         Session.Timeout = 900; //15 hours
}

Для файлов cookie в (startup.auth.cs):

public void ConfigureAuth(IAppBuilder app)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
         Provider = new CookieAuthenticationProvider
                {
                   OnValidateIdentity = async context =>
                    {
                        // invalidate user cookie if user's security stamp have changed, force logout user if its logout from any other device
                        var invalidateBySecirityStamp = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                            validateInterval: TimeSpan.FromMinutes(0),
                            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager));
                        await invalidateBySecirityStamp.Invoke(context);

                        bool xyzRole = false;

                        if (context.Identity != null)
                        {
                            xyzRole = context.Identity.Claims.Any(c => c.Type == ClaimTypes.Role && c.Value == 'xyz');
                        }

                        // check if enough time has passed to invalidate cookie
                        var currentUtc = DateTimeOffset.UtcNow;
                        if (context.Options != null && context.Options.SystemClock != null)
                        {
                            currentUtc = context.Options.SystemClock.UtcNow;
                        }
                        context.Properties.AllowRefresh = true;
                        if (xyzRole)
                        { //context.Properties.ExpiresUtc is always null
                            context.Properties.ExpiresUtc = currentUtc.AddMinutes(900);
                        }
                        else
                        {
                            context.Properties.ExpiresUtc = currentUtc.AddMinutes(5);
                        }
                    }
          }
    }
}

Примечание: Тайм-аут сеанса работает нормально. Потому что, если сеанс истек, я поймаю его в Global.asax.cs в функции Session_End.

Проверка подлинности cookie не работает должным образом, она выходит из системы примерно через 30 минут бездействия.

Что я делаю не так.

...