感谢这个帖子中的答案,我也能够为自己工作。 没有在这里解决的是,如果需要修改需要服务的声明。就我而言,我需要构建服务提供者以获得正确的依赖关系,从而转换声明。 (我也能够在不进行转换的情况下删除声明 - 在这里也显示该代码)。
public void ConfigureServices(IServiceCollection services)
{
services
.AddAuthentication(options =>
{
// set options
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
// set options
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
// options such as Authority, ClientId, etc set here
options.Authority = "your-value";
options.ClientId = "your-value";
// ...
// remove automatically mapped claims we do not need, keeps the authentication cookie smaller
options.ClaimActions.DeleteClaim("sid");
options.ClaimActions.DeleteClaim("idp");
options.ClaimActions.DeleteClaim("s_hash");
options.ClaimActions.DeleteClaim("auth_time");
options.Events.OnTicketReceived = async context =>
{
// Build the service provider and necessary dependencies
// in order to enhance our claims once we receive it initially
ServiceProvider serviceProvider = services.BuildServiceProvider();
ICustomProvider customProvider = serviceProvider.GetService<ICustomProvider>();
EnhanceClaimsTransformation claimsTransformation = new EnhanceClaimsTransformation(customProvider);
context.Principal = await claimsTransformation.TransformAsync(context.Principal);
await Task.CompletedTask;
};
});
}
增强声明转换
(ICustomProvider在ConfigureServices的依赖注入中注册)
请注意,在此代码中,我们需要对主体进行克隆以实际向其添加声明。
public class EnhanceClaimsTransformation : IClaimsTransformation
{
private readonly ICustomProvider _customProvider;
public EnhanceClaimsTransformation(ICustomProvider customProvider)
{
_customProvider = customProvider;
}
/// <summary>
/// Upon authentication, we transform the claims in order to enhance
/// the claims with user-enhanced values.
/// </summary>
/// <param name="principal"></param>
/// <returns></returns>
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
// https://gunnarpeipman.com/aspnet-core-adding-claims-to-existing-identity/
ClaimsPrincipal clone = principal.Clone();
ClaimsIdentity claimsIdentity = (ClaimsIdentity)clone.Identity;
Response response = await _customProvider.Find(principal.Identity.Name, CancellationToken.None);
// Setting claims values
claimsIdentity.AddClaims(new List<Claim>
{
new Claim("Datapoint1", response.Datapoint1),
new Claim("Datapoint2", response.Datapoint2),
// ...
});
return clone;
}
}