添加具有 Asp.Net 核心身份的持久声明
Add persistent claim with Asp.Net Core Identity
我已经构建了基于身份的自定义授权模块。
来自 db 的权限通过 UserClaimsPrincipalFactory 加载到 Claims 中,效果很好,但仅在登录时发生。
授予新权限时我想我有两个选择:
- 向当前 ClaimsIdentity 添加声明
- 通过重新创建身份来刷新所有声明
问题是当我尝试使用 user.Identity.AddClaim()
添加声明时,它不会在重新加载页面时持续存在。
而且我找不到有关如何重新加载 ClaimsIdentity 的信息。
我不确定项目何时需要添加外部声明。身份是基于cookie的,每次请求都会携带cookie,所以身份可以解析cookie作为声明。如果要重新加载ClaimsIdentity,需要重用方法SignInAsync
重新生成cookie。但是有一个全局方法IClaimsTransformation
可以帮助你根据不同的情况添加临时声明。
public class Tanstromer : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var claims = new List<Claim> { };
var identity = principal.Identity as ClaimsIdentity;
identity.AddClaim(new Claim("",""));
//you can add some justification here
var userPrinicpal = new ClaimsPrincipal(identity);
return Task.FromResult(principal);
}
}
在ConfigureService中添加
services.AddScoped<IClaimsTransformation, Tanstromer>();
我已经构建了基于身份的自定义授权模块。 来自 db 的权限通过 UserClaimsPrincipalFactory 加载到 Claims 中,效果很好,但仅在登录时发生。
授予新权限时我想我有两个选择:
- 向当前 ClaimsIdentity 添加声明
- 通过重新创建身份来刷新所有声明
问题是当我尝试使用 user.Identity.AddClaim()
添加声明时,它不会在重新加载页面时持续存在。
而且我找不到有关如何重新加载 ClaimsIdentity 的信息。
我不确定项目何时需要添加外部声明。身份是基于cookie的,每次请求都会携带cookie,所以身份可以解析cookie作为声明。如果要重新加载ClaimsIdentity,需要重用方法SignInAsync
重新生成cookie。但是有一个全局方法IClaimsTransformation
可以帮助你根据不同的情况添加临时声明。
public class Tanstromer : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
var claims = new List<Claim> { };
var identity = principal.Identity as ClaimsIdentity;
identity.AddClaim(new Claim("",""));
//you can add some justification here
var userPrinicpal = new ClaimsPrincipal(identity);
return Task.FromResult(principal);
}
}
在ConfigureService中添加
services.AddScoped<IClaimsTransformation, Tanstromer>();