Почтальон не может получить доступ к AAD Asp. net core 3.1. 401 несанкционированный - PullRequest
0 голосов
/ 23 апреля 2020

Я настроил защищенную AAD asp. net core 3.1 Restapi веб-службу, выполнив следующие действия.

  1. Зарегистрируйте приложение сервера (HelloWorld), а затем добавьте область действия.

  2. Зарегистрируйте клиентское приложение (domino-client) и создайте секрет. Затем добавьте разрешение приложения сервера.

  3. Добавление AAD-аутентификации в ядро ​​asp. net. Я создаю проект api rest и делаю следующие изменения. (Config Auth связанные службы и промежуточное программное обеспечение. Config контроллер.)

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddAuthentication(o =>
            {
                o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(o =>
            {
                o.Authority = "https://login.microsoftonline.com/{tenant_id}";
                o.Audience = "a1faffea-24c6-42ff-9586-ee86ec7b8e80";          // server app client id
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthentication();  // Add aad auth.

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    [Authorize]  // Enable auth.
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
          .....
        }
    }

Затем попробуйте использовать почтальон для доступа к API.

Некоторые пармы при доступе к токену.

  • URL-адрес токена доступа: получен с Конечная точка
  • Идентификатор клиента: идентификатор клиента клиентского приложения
  • Секрет клиента: секрет клиентского приложения
  • область действия: область приложения сервера

Howerer, я получаю 401 несанкционированная ошибка. Что-то не так с процессом?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Согласно предоставленной вами информации, вы хотите использовать Поток учетных данных клиента OAuth 2.0 для доступа к API, защищенному Azure AD. Если это так, вам нужно определить роль приложения вместо области действия в вашем серверном приложении.

Подробные шаги приведены ниже

  1. Создание серверного приложения

  2. Определение роли приложения

    a. Выберите приложение, в котором вы хотите определить роли приложения. Затем выберите Манифест .

    b. Отредактируйте манифест приложения, найдя параметр appRoles и добавив все свои роли приложений. Это должно быть примерно так:

    "appRoles": [
    {
    "allowedMemberTypes": [
      "Application"
    ],
    "displayName": "access the web api",
    "id": "47fbb575-859a-4941-89c9-0f7a6c30beac",
    "isEnabled": true,
    "description": "Consumer apps have access to web api.",
    "value": "Consumer"
    }
    ],
    
  3. Зарегистрируйте клиентское приложение и создайте секрет.

  4. Добавление роли приложения для клиентского приложения enter image description here

  5. Настройка веб-API

    а. Startup.cs

    public void ConfigureServices(IServiceCollection services)
      {
    services.AddAuthentication(x =>
          {
              x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
              x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
          })
        .AddJwtBearer(x =>
        {
            x.Authority = "https://login.microsoftonline.com/<tenant id>/v2.0";
            x.TokenValidationParameters = new TokenValidationParameters
            {
    
                ValidateIssuer = false,
                 ValidAudiences = new[] {"<app id>","<app id url>" }
            };
        });
          services.AddControllers();
      }
      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
          if (env.IsDevelopment())
          {
              app.UseDeveloperExceptionPage();
          }
    
          app.UseHttpsRedirection();
    
          app.UseRouting();
    
          app.UseAuthentication();
          app.UseAuthorization();
    
          app.UseEndpoints(endpoints =>
          {
              endpoints.MapControllers();
          });
      }
    

    b. добавьте [Authorize] в вашем контроллере API, чтобы включить аутентификацию

  6. Тест в почтальоне

    a. Получить токен доступа enter image description here

    b. Вызов API enter image description here

0 голосов
/ 24 апреля 2020

Вы используете поток учетных данных клиента для доступа к вашему защищенному веб-API, аудитория токена доступа составляет api://fxxxb30-xxx-xxx-xxxx-bcaae52203cf, поэтому попробуйте изменить параметры AddJwtBearer на (также обратите внимание, что вы используете Azure Конечная точка AD V2.0):

.AddJwtBearer(o =>
 {
     o.Authority = "https://login.microsoftonline.com/{tenant_id}/v2.0"; <--AAD V2.0
     o.Audience = "api://a1faffea-24c6-42ff-9586-ee86ec7b8e80";   <--  add api//     
 });

Другая проблема заключается в добавлении разрешения делегата, поэтому токен доступа, выданный потоком учетных данных клиента, не будет включать разрешение делегата, вместо этого следует использовать потоки делегатов, например поток кода авторизации .

...