如何设置基于身份声明角色的.AspNetCore.Identity.Application Cookies有效期?

时间:2018-10-23 15:15:05

标签: c# asp.net-core asp.net-core-identity

我正在根据登录用户的声明角色来设置{{index | async}} Cookie的到期时间。

.AspNetCore.Identity.Application中的所有配置选项中,我可以访问cookie属性,但不能访问用户声明。因此,我无法动态设置到期时间。我们正在使用ConfigureServices进行身份验证。

任何人都可以针对我需要重写的类或需要注册的中间件为我指明正确的方向吗?

1 个答案:

答案 0 :(得分:0)

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();

    };
});

它将按预期工作。