[英]Asp.Net Core 3 Identity - Custom Claims not present in JWT from browser
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
并将声明添加到GenerateClaimsAsync
方法中的ClaimsIdentity
。
但是,我觉得奇怪的是为什么在浏览器中收到的 JWT 不包含MyCustomClaimsFactory
添加的声明。
我期望在浏览器中看到 JWT 中的自定义声明好吗?
任何人都可以建议挖掘的方向......为什么 JWT 中没有声明?
将分享我的结果。 希望这会对其他人有所帮助。
我已经实现了IProfileService
并在ConfigureServices
中通过管道传输了.AddProfileService<ProfileService>()
实现。
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
的覆盖无法解决这个问题。
将尝试更深入地研究这些领域。
所以今天我遇到了同样的问题。 我以前没有使用过 IdentityServer,所以我不确定以下是否是正确的方法,但它肯定比创建自己的 IProfileService 实现更容易。
默认配置文件服务调用
context.AddRequestedClaims(principal.Claims);
请求的声明在您正在访问的 IdentityServer ApiResource 上定义。 此 ApiResource 配置是通过调用创建的
services.AddAuthentication()
.AddIdentityServerJwt();
这将创建一个名为“{Environment.ApplicationName}API”的默认 ApiResource 配置。 此 object 还包含一组声明类型,以在生成 JWT 时包含。
我找不到任何关于这是否也可以在 appsettings.json 中设置的文档,但您可以在启动代码中访问它。
TLDR; 将您的启动代码更改为类似于以下内容:
启动.cs:
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment environment)
{
Configuration = configuration;
Environment = environment;
}
public IConfiguration Configuration { get; }
public IWebHostEnvironment Environment { get; }
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddIdentityServer()
.AddApiAuthorization<User, ApplicationDbContext>(options =>
{
// The options.ApiResources collection is automatically populated
// by services.AddAuthentication().AddIdentityServerJwt();
var apiResource = options.ApiResources[$"{Environment.ApplicationName}API"];
// Example: add the user's roles to the token
apiResource.UserClaims.Add(JwtClaimTypes.Role);
// Example: add another custom claim type
apiResource.UserClaims.Add("CustomClaimName");
});
services.AddAuthentication()
.AddIdentityServerJwt();
// ...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.