Внедренные IPrincipal Claims пустые после добавления Claims Transformer - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать авторизацию на основе утверждений с использованием аутентификации 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 с пустым списком претензий.
...