簡體   English   中英

如何設置基於身份聲明角色的.AspNetCore.Identity.Application Cookies有效期?

[英]How to set .AspNetCore.Identity.Application Cookies expiration based on Identity Claims Role?

我正在根據登錄用戶的聲明角色來設置.AspNetCore.Identity.Application Cookie的到期時間。

ConfigureServices所有configure選項中,我可以訪問cookie屬性,但是不能訪問用戶聲明。 因此,我無法動態設置到期時間。 我們正在使用Microsoft.AspNetCore.Identity SignInManager進行身份驗證。

任何人都可以針對我需要重寫的類或需要注冊的中間件為我指出正確的方向嗎?

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

    };
});

它將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM