Как установить истечение срока действия файлов cookie.AspNetCore.Identity.Application на основе роли утверждений о личности?
Я ищу, чтобы установить .AspNetCore.Identity.Application
Время истечения срока действия cookie зависит от роли претензий пользователя, который входит в систему.
Во всех настройках параметров в ConfigureServices
У меня есть доступ к свойствам cookie, но нет доступа к заявкам пользователей. Поэтому я не могу динамически установить время истечения. Мы используем Microsoft.AspNetCore.Identity SignInManager
аутентифицировать.
Может ли кто-нибудь указать мне правильное направление относительно того, какой класс мне нужно переопределить или какое промежуточное программное обеспечение мне нужно зарегистрировать для достижения этой цели?
1 ответ
Обработчик проверки подлинности cookie сработает OnSigningIn
событие перед генерацией билета аутентификации, см. исходный код на GitHub:
protected async override Task HandleSignInAsync(ClaimsPrincipal user, AuthenticationProperties properties)
{
// ...
if (!signInContext.Properties.ExpiresUtc.HasValue)
{
signInContext.Properties.ExpiresUtc = issuedUtc.Add(Options.ExpireTimeSpan);
}
await Events.SigningIn(signInContext);
if (signInContext.Properties.IsPersistent)
{
var expiresUtc = signInContext.Properties.ExpiresUtc ?? issuedUtc.Add(Options.ExpireTimeSpan);
signInContext.CookieOptions.Expires = expiresUtc.ToUniversalTime();
}
var ticket = new AuthenticationTicket(signInContext.Principal, signInContext.Properties, signInContext.Scheme.Name);
// ...
}
(Обратите внимание на строку await Events.SigningIn(signInContext);
)
Это дает нам возможность изменить время истечения, используя Events.OnSigningIn
, Так в вашем ConfigureServices()
метод, добавьте коды, как показано ниже:
services.ConfigureApplicationCookie(opt =>{
opt.Events.OnSigningIn = async(signinContext)=>{
// you can use the pricipal to query claims and roles as you need
var x = signinContext.Principal.Claims.First(c=>c.Type=="X1" && ...);
// set the expiration time according to claims/roles dynamically
signinContext.Properties.ExpiresUtc = DateTimeOffset.Now.AddSeconds(100);
signinContext.CookieOptions.Expires = signinContext.Properties.ExpiresUtc?.ToUniversalTime();
};
});
Это будет работать как ожидалось.