【问题标题】:How to set .AspNetCore.Identity.Application Cookies expiration based on Identity Claims Role?如何根据身份声明角色设置 .AspNetCore.Identity.Application Cookies 过期?
【发布时间】:2018-10-23 15:15:05
【问题描述】:
我希望根据登录用户的声明角色设置.AspNetCore.Identity.Application Cookie 的过期时间。
在ConfigureServices 中的所有配置选项中,我可以访问 cookie 属性,但无法访问用户声明。因此我不能动态设置过期时间。我们正在使用Microsoft.AspNetCore.Identity SignInManager 进行身份验证。
谁能指出我需要重写什么类或我需要注册什么中间件来实现这一点的正确方向?
【问题讨论】:
标签:
c#
asp.net-core
asp.net-core-identity
【解决方案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();
};
});
它将按预期工作。