IdentityServer4 Авторизация завершилась с глобальной политикой авторизации - PullRequest
0 голосов
/ 06 июля 2019

Я установил API, который действует как служба аутентификации / авторизации и в то же время предоставляет некоторые конечные точки для извлечения данных.

API настроен с помощью IdentityServer4. Я могу успешно получить токен доступа через учетные данные клиента. Однако, когда я пытаюсь вызвать защищенную конечную точку с полученным токеном, я получаю 404, не найденный. Журнал показывает, что запрос не авторизован.

Я подозреваю, что это как-то связано с тем, как я добавляю политику авторизации. Он должен применяться глобально ко всем контроллерам со схемой аутентификации по умолчанию, которую я применяю в AddAuthentication(), например:

    IdentityModelEventSource.ShowPII = true;

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => 
    {
        options.Authority = "http://localhost";
        options.RequireHttpsMetadata = false;
        options.Audience = "identityService";
    }).AddMvc(options => 
    {
       var policy = new AuthorizationPolicyBuilder()
          .RequireAuthenticatedUser()
          .Build();

       options.Filters.Add(new AuthorizeFilter(policy));
    }
    ...

Если удалить политику, я могу без проблем вызвать соответствующую конечную точку.

Что я делаю не так?

Заранее спасибо

1 Ответ

1 голос
/ 06 июля 2019

Здесь имеется несколько проблем.

  1. В потоке учетных данных клиента нет пользователя.Маркер не содержит претензию sub.Вот почему нет аутентифицированного пользователя.Это объясняет Несанкционированную ошибку, которая имеет HttpStatusCode 401.

  2. Фильтр вызывает авторизацию для всех методов .Когда к методу обращается неавторизованный пользователь, это приводит к HttpStatusCode 404. Это означает, что определенные методы должны оставаться доступными для анонимных пользователей.Вы можете исключить методы из глобальной авторизации, установив атрибут AllowAnonymous на уровне низший .

Например, HomeController:

[AllowAnonymous]
public IActionResult Error()
{

Дляпоток учетных данных клиента, вы можете захотеть изменить фильтр на что-то, что является частью токена, например область:

var policy = new AuthorizationPolicyBuilder()
                .RequireClaim("scope", "MyScope").Build();

Хотя это может не подходить в качестве глобального фильтра, когда вы смешиваете функциональность (изIdentityServer и Api).

Вместо этого вы можете настраивать политики и использовать атрибуты.При запуске:

Services.AddAuthorization(option =>
{
    option.AddPolicy("MyScopePolicy", p => p.RequireScope("MyScope"));
}

И в контроллере:

[Authorize("MyScopePolicy")]
[ApiController]
public class MyController : ControllerBase
{
...