Атрибут авторизации с ролями и несколькими схемами аутентификации для каждой настраиваемой политики по умолчанию.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Атрибут авторизации с ролями и несколькими схемами аутентификации для каждой настраиваемой политики по умолчанию.

Сообщение Гость »

Вопрос
Как сделать так, чтобы токены для обеих схем работали с ролями независимо от того, используется ли токен схемы «По умолчанию» или «Вторичный»?
Преамбула
Примечание. Я не использую ASP.NET Core Identity, поскольку это не является частью данного проекта.

Я хочу добавить аутентификацию IdentityServer в приложение, которое я создаю, а затем постепенно отказаться от текущего способа входа в систему.
Код
У меня следующая настройка:

services.AddAuthentication(o => { o.DefaultAuthenticateScheme = "По умолчанию"; o.DefaultScheme = "По умолчанию"; }) .AddJwtBearer("По умолчанию", o => DefaultConfig(o)) .AddJwtBearer("Secondary", o => SecondaryConfig(o)); public static void SecondaryConfig (JwtBearerOptions opts) { opts.Events = новый JwtBearerEvents() { OnTokenValidated = контекст => { if (context.Principal.Identity не является ClaimsIdentityclaimsIdentity) { context.Fail("Не удалось"); возвращаться; } var newClaims = context.Principal.Claims.Append(new Claim(ClaimTypes.Role, «Администратор»)); вар newClaimsIdentity = новый ClaimsIdentity(newClaims,claimsIdentity.AuthenticationType, ClaimTypes.Name, ClaimTypes.Role); context.Principal = новый ClaimsPrincipal(newClaimsIdentity); вернуть Задача.ЗавершеннаяЗадача; }; }; } Реализации DefaultConfig и SecondaryConfig не имеют значения, но по сути они схожи в обоих случаях и предоставляют одно и то же утверждение в обоих случаях.

Я также зарегистрировал следующую политику, установив ее по умолчанию:

services.AddAuthorization(opts => { opts.AddPolicy("myPolicy", policy => { политика.RequireAuthenticatedUser(); policy.AddAuthenticationSchemes("По умолчанию", "Вторичный"); }); opts.DefaultPolicy = opts.GetPolicy("myPolicy"); }); Тогда я использую промежуточное программное обеспечение следующим образом:

app.UseAuthentication(); приложение.UseRouting(); приложение.UseAuthorization(); app.UseEndpoints(e => e.MapControllers()); У меня есть два метода контроллера:

[Авторизовать] [HttpGet("/один")] публичный метод IActionResultOne() { вернуть ОК("Привет"); } [Авторизовать(Роли = "Администратор")] [HttpGet("/два")] публичный метод IActionResultTwo() { вернуть ОК("Мир"); } С моим кодом в том виде, в котором он есть на данный момент, использование токена JWT «по умолчанию» для вызова как /one, так и /two приводит к ответу 200 с ожидаемым органы реагирования. Если вместо этого я использую «вторичный» токен JWT, вызов «/one» дает ответ 200 с ожидаемым телом ответа, но вызов «/two» дает ответ 401 и событие OnTokenValidated в конфигурации даже не поднят.

Если я изменю o.DefaultAuthenticateScheme на «Secondary», наблюдается противоположное поведение: токен JWT «по умолчанию» может успешно вызывать только /one и «Secondary» " Токен JWT может успешно вызывать /one и /two.

Я трижды проверил правильность ролей и даже создал API для их печати через HttpContext и могу подтвердить, что роль «Администратор» присутствует в обоих случаях.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»