Как установить истечение срока действия файлов cookie .AspNetCore.Identity.Application на основе роли утверждений о личности? - PullRequest
0 голосов
/ 23 октября 2018

Я хочу установить срок действия .AspNetCore.Identity.Application Cookie в зависимости от роли утверждений пользователя, который входит в систему.

Во всех параметрах конфигурации в ConfigureServices У меня есть доступ к cookieсвойства, но нет доступа к претензиям пользователя.Поэтому я не могу динамически установить время истечения.Мы используем Microsoft.AspNetCore.Identity SignInManager для аутентификации.

Может ли кто-нибудь указать мне правильное направление относительно того, какой класс мне нужно переопределить или какое промежуточное программное обеспечение мне нужно зарегистрировать для достижения этой цели?

1 Ответ

0 голосов
/ 24 октября 2018

Обработчик проверки подлинности сookie будет вызывать событие 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();

    };
});

Это будет работать, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...