У меня есть веб-приложение. NET Core 3.1, работающее в среде Active Directory, поэтому основная аутентификация просто выполняется с использованием опции IISDefault
services.AddAuthentication(IISDefaults.AuthenticationScheme);
Что касается авторизации, у меня есть SQL Серверная база данных, в которой я храню дополнительную информацию о пользователях, такую как роли и разрешения, которые добавляются к аутентифицированному пользователю (в форме объекта ClaimsPrincipal
) посредством настраиваемой реализации интерфейса IClaimsTransformation
:
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
if (principal == null || !principal.Identity.IsAuthenticated) return principal;
// retrieve those users additional info and transforms them into claims
// ContextUser is an injected dummy user based on the current environment
Task<IList<Claim>> applicationUserClaims = GetApplicationClaimsAsync(ContextUser.ContextUserId);
ClaimsIdentity contextIdentity;
if (ContextUser.ContextUserId != principal.Identity.Name)
{
List<Claim> idClaim = new List<Claim>()
{
new Claim(ClaimTypes.Name, ContextUser.ContextUserId)
};
contextIdentity = new ClaimsIdentity (idClaim);
}
else
{
contextIdentity = principal.Identity as ClaimsIdentity;
contextIdentity.AddClaims(principal.Claims);
}
contextIdentity.AddClaims(await applicationUserClaims);
ClaimsPrincipal contextPrincipal = new ClaimsPrincipal(contextIdentity);
return contextPrincipal;
}
После этого будут доступны дополнительные утверждения для настраиваемых определений политик, таких как
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy =>
policy.RequireClaim("http://archiviocian/role", "ADMIN"));
}
Я хотел добавить настраиваемого ASP. NET поставщика хранилища Core Identity и, следуя предоставлена документация , я создал свой собственный Identity Manager и Identity Store. Теперь я нахожусь в странном положении, так как у меня есть два разных типа личности: один, доступный через HttpContext.User
, и другой, доступный через UserManager<AppUser>
, и это плохо пахнет. Много.
Как связать их вместе, особенно для целей определения политики, учитывая, что определение настраиваемой политики кажется, работает только с ClaimPrincipal
, связанным с каждым запросом?