Asp.Net Identity Core中用户登录时如何将动态数据添加为用户资料声明字段
方案可行性说明
完全可以实现,以下是通用的落地步骤:
实现步骤
- 第一步:扩展登录入参模型,在原有的用户名、密码字段之外,新增字段接收前端提交的动态字符串数据,示例字段命名
CustomDynamicPayload。 - 第二步:注册
IHttpContextAccessor服务,用于在声明生成环节获取当前请求携带的动态数据,在Program.cs中添加注册代码:builder.Services.AddHttpContextAccessor(); - 第三步:自定义用户声明工厂,继承自带的
UserClaimsPrincipalFactory<TUser>类,重写CreateAsync方法,添加自定义声明的逻辑,示例代码:
public class CustomUserClaimsFactory : UserClaimsPrincipalFactory<IdentityUser> { private readonly IHttpContextAccessor _httpContextAccessor; public CustomUserClaimsFactory(UserManager<IdentityUser> userManager, IOptions<IdentityOptions> optionsAccessor, IHttpContextAccessor httpContextAccessor) : base(userManager, optionsAccessor) { _httpContextAccessor = httpContextAccessor; } public override async Task<ClaimsPrincipal> CreateAsync(IdentityUser user) { var principal = await base.CreateAsync(user); var identity = (ClaimsIdentity)principal.Identity; // 读取当前请求中暂存的动态数据 if (_httpContextAccessor.HttpContext.Items.TryGetValue("CustomDynamicPayload", out var payload)) { identity.AddClaim(new Claim("custom_dynamic_payload", payload?.ToString() ?? string.Empty)); } return principal; } }
- 第四步:替换默认的声明工厂服务,在Program.cs中添加:
builder.Services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, CustomUserClaimsFactory>(); - 第五步:在登录接口的逻辑中,校验用户名密码通过后,先将前端传递的动态数据存入
HttpContext.Items,再执行SignIn操作,后续生成的身份凭证(Cookie/Access Token)就会自动携带该自定义声明。
特殊场景适配
如果你使用的是Identity Server的密码授权流,不需要自定义声明工厂,直接实现
IResourceOwnerPasswordValidator接口,在ValidateAsync方法中完成账号密码校验后,直接把动态数据添加到GrantValidationResult的声明集合中即可。
可选持久化逻辑
如果需要该动态数据长期关联到用户资料,不需要每次登录都提交,可以在登录验证通过后调用UserManager.AddClaimAsync(user, new Claim("custom_dynamic_payload", payload))方法,将声明写入Identity的用户声明表,后续用户每次登录都会自动加载该声明。
内容的提问来源于stack exchange,提问作者Vu Tran
相关产品推荐
相关产品推荐

