Вопрос
Как сделать так, чтобы токены для обеих схем работали с ролями независимо от того, используется ли токен схемы «По умолчанию» или «Вторичный»?
Преамбула
Примечание. Я не использую 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 и могу подтвердить, что роль «Администратор» присутствует в обоих случаях.
Атрибут авторизации с ролями и несколькими схемами аутентификации для каждой настраиваемой политики по умолчанию. ⇐ C#
Место общения программистов C#
1695289762
Гость
Вопрос
Как сделать так, чтобы токены для обеих схем работали с ролями независимо от того, используется ли токен схемы «По умолчанию» или «Вторичный»?
Преамбула
Примечание. Я не использую 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 и могу подтвердить, что роль «Администратор» присутствует в обоих случаях.
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия