c# - Asp.Net Core 3 Identity - 来自浏览器的 JWT 中不存在自定义声明
问题描述
Asp.Net Core 3.0
我正在使用ASP.NET Core web application with Angular and Authentication
(个人用户帐户)模板(来自 Visual Studio 2019)。
我的目的是在生成的内容中添加一些自定义声明JWT
并在浏览器中使用它们。
为了做到这一点,我扩展了UserClaimsPrincipalFactory
public class MyCustomClaimsInjector : UserClaimsPrincipalFactory<ApplicationUser>
{
public MyCustomClaimsFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
{
}
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
{
var id = await base.GenerateClaimsAsync(user);
id.AddClaim(new Claim("my_claim1", "AdditionalClaim1"));
id.AddClaim(new Claim("my_claim2", "AdditionalClaim2"));
return id;
}
}
同样,我已经在Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<ApplicationUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddClaimsPrincipalFactory<MyCustomClaimsFactory>();
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
services.AddAuthentication()
.AddIdentityServerJwt();
services.AddControllersWithViews();
services.AddRazorPages();
// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
}
在登录阶段,从 SPA 客户端开始,调试器通过MyCustomClaimsFactory
并将声明添加到ClaimsIdentity
方法中GenerateClaimsAsync
。
但是,我觉得奇怪的是为什么在浏览器中收到的 JWT 不包含MyCustomClaimsFactory
.
我是否期望在浏览器中看到 JWT 中的自定义声明?
任何人都可以建议挖掘的方向......为什么 JWT 中不存在这些声明?
解决方案
将分享我的结果。希望这会对其他人有所帮助。
我IProfileService
已经.AddProfileService<ProfileService>()
在ConfigureServices
.
public class ProfileService : IProfileService
{
protected UserManager<ApplicationUser> _userManager;
public ProfileService(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var user = await _userManager.GetUserAsync(context.Subject);
var claims = new List<Claim>
{
new Claim("my_FirstName", "user_FirstName"),
new Claim("my_LastName", "user_LastName")
};
context.IssuedClaims.AddRange(claims);
}
public async Task IsActiveAsync(IsActiveContext context)
{
var user = await _userManager.GetUserAsync(context.Subject);
context.IsActive = (user != null);
}
}
Startup.cs 文件
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>()
.AddProfileService<ProfileService>();
有了这个,现在 JWT 包含了我的自定义声明。
我不确定为什么覆盖UserClaimsPrincipalFactory
无法解决这个问题。
将尝试更深入地研究这些领域。
推荐阅读
- r - 在 R 中的 igraph 图中添加图例
- java - 如何接受 TCP 请求进入 Spring Boot 应用程序?
- javascript - 通过 ajax 发送数据时 JSON 输入意外结束
- c++ - 宏函数调用缺少参数警告,即使给定参数
- c# - 有没有办法从数组中获取最常见的项目并排除双重项目?
- c - 仅使用 1 个递归调用 C 的斐波那契数列
- tkinter - widget.config() 和 widget[] 之间有什么功能区别?
- c - 将 char 连接到 char*
- python - 运行 os.system("kinit") 时出现 Python 错误 - sh: 1: kinit: not found
- qt - Qt App bundle 签名错误:QtCore 和其他人的“预期有时间戳但未找到”