Я пытаюсь использовать авторизацию на основе утверждений с использованием аутентификации Windows в ASP.NET Core. У меня есть преобразователь утверждений, который устанавливает требования пользователя. Я также вставляю IPrincipal
в DbContext
, чтобы получить доступ к текущему пользователю, когда вызывается SaveChanges()
для регистрации обновленных сущностей.
В Startup.cs:
services.AddTransient<IPrincipal>(provider => provider.GetService<IHttpContextAccessor>()?.HttpContext?.User);
services.AddTransient<IClaimsTransformation, MyClaimsTransformer>();
В MyDbContext.cs:
protected readonly IPrincipal _principal ;
public MyDbContext(DbContextOptions<MyDbContext> options, IPrincipal principal) : base(options)
{
_principal = principal;
}
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
// Do something with Claim value...
await base.SaveChangesAsync(cancellationToken);
}
Я добавил трансформатор претензий, чтобы добавить информацию о претензиях:
public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
// Add Claims...
return principal;
}
SaveChangesAsync
вызывается в промежуточном программном обеспечении пользователя для регистрации доступа к приложению. До добавления преобразователя утверждений IPrincipal
, введенный в DbContext
, представлял собой WindowsPrincipal
, и в нем содержались необходимые мне требования, такие как PrimarySid и т. Д. Теперь после добавления преобразования это ClaimsPrincipal
, однако список претензий теперь пусто.
Посредством отладки я могу проверить, что TransformAsync
выполняется до SaveChangesAsync
, но внедрение конструктора в контекст db происходит до преобразования (DbContext
- это служба Scoped, Transfomer для утверждений Transient).
Резюме:
- Перед добавлением трансформатора утверждений, введенный
IPrincipal
представляет собой WindowsPrincipal
с заполненным списком утверждений.
- После добавления преобразователя претензий, введенный
IPrincipal
представляет собой ClaimsPrincipal
с пустым списком претензий.