Мой веб-сайт 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 минут бездействия.
Что я делаю не так.