В режиме разработки за все время тестирования авторизация держится установленное время 7 дней, но как только заливаю на сервер Windows Server под IIS 10 авторизация держится примерно 20-30 минут, далее авторизация слетает, причем куки еще живы, я подозреваю что в куках ключ лежит и сопоставляется с сервером. На форумах вменяемого ответа или даже темы найти не могу.
Раньше я сам делал куки и шифровал их затем заливал в ответ, тогда еще писал на asp web form, решил шагать в ногу и нарвался на черный ящик без ответ почему ...
Приведу реализацию, от инициализация конфига до валидации, надеюсь на помощь
Program.cs
//.....
builder.Services
.AddAuthentication(BaseProperties.CookieAuthenticationDefaultsScheme)
.AddCookie(BaseProperties.CookieAuthenticationDefaultsScheme, options =>
{
options.Cookie.Name = BaseProperties.CookieName;
options.ClaimsIssuer = BaseProperties.AppIssuer;
options.ExpireTimeSpan = TimeSpan.FromDays(BaseProperties.CookieMaxAgeDays);
options.Cookie.MaxAge = TimeSpan.FromDays(BaseProperties.CookieMaxAgeDays);
options.SlidingExpiration = true;
options.LoginPath = "/Login/Index";
options.LogoutPath = "/Login/Index";
});
//.....
app.UseAuthentication();
app.UseAuthorization();
Create ClaimsPrincipal
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, id.ToString(), ClaimValueTypes.Integer));
claims.Add(new Claim("Login", _login));
claims.Add(new Claim("Password", _password));
claims.Add(new Claim(ClaimsIdentity.DefaultIssuer, BaseProperties.AppIssuer));
ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, BaseProperties.CookieAuthenticationDefaultsScheme);
ClaimsPrincipal principal = new ClaimsPrincipal(claimsIdentity);
await HttpContext.SignInAsync(
BaseProperties.CookieAuthenticationDefaultsScheme,
claims,
new AuthenticationProperties() {
IsPersistent = true,
ExpiresUtc = DateTime.Now.AddDays(BaseProperties.CookieMaxAgeDays)
}
CustomAutorize
public class CustomAutorize : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
ServiceWorkers serviceMyUser = new ServiceWorkers();
var user = context.HttpContext.User;
//'X-Requested-With': 'XMLHttpRequest'
string requestWith = context.HttpContext.Request.Headers["X-Requested-With"].ToString() ?? string.Empty;
if (user != null)
{
if (serviceMyUser.CheckedAuth(user))
{
return;
}
else
{
context.Result = string.IsNullOrEmpty(requestWith) ? new RedirectToActionResult("Index", "Login", null) : new UnauthorizedObjectResult("Не авторизован либо сессия истекла");
return;
}
}
else
{
context.Result = string.IsNullOrEmpty(requestWith) ? new RedirectToActionResult("Index", "Login", null) : new UnauthorizedObjectResult("Не авторизован либо сессия истекла");
}
}
}