Один из подходов состоит в том, чтобы зарегистрировать пользовательский IClaimsTransformation
, где вы можете создать пользовательский принципал и изменить его личность / требования / роли по мере необходимости.
Служба IClaimsTransformation
, если она существует, будет вызвана после успешной аутентификации запроса.
Я создаю пользовательское преобразование, которое вступает в силу только в среде разработки, как показано ниже:
public class CustomClaimsTransformation : IClaimsTransformation
{
private readonly IHostingEnvironment env;
// if you're using 3.0, use `IWebHostEnvironment` instead
public CustomClaimsTransformation(IHostingEnvironment env)
{
this.env = env;
}
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
if (!NeedChangeClaims(principal))
return Task.FromResult(principal);
var identity = principal.Identity as ClaimsIdentity;
// filter claims (i.e. remove claims)
var claims= identity.Claims
.Where(c => !ShouldRemoveThisClaim(c));
// map a new identity
identity = new ClaimsIdentity(claims, identity.AuthenticationType, identity.RoleClaimType,identity.NameClaimType);
// add extra claims as you like
identity.AddClaim(new Claim(ClaimTypes.StreetAddress,"NY"));
return Task.FromResult(new ClaimsPrincipal(identity));
}
private bool NeedChangeClaims(ClaimsPrincipal cp)
{
if (env.IsDevelopment()) {
return true;
}
return false;
}
private bool ShouldRemoveThisClaim(Claim c)
{
if (c.Type == ClaimTypes.Role && c.Value == "FIAdmin")
return true;
if (c.Type == ClaimTypes.Role && c.Value == "HRAdmin")
return true;
if (c.Type == ClaimTypes.OtherPhone)
return true;
return false;
}
}
Чтобы включить эту службу, нам также необходимо зарегистрировать ее при запуске:
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddSingleton<IClaimsTransformation, CustomClaimsTransformation>();