Azure Сервисное приложение - настроить загрузочный хост для использования токена носителя - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу разместить свой REST API в Azure Сервисном приложении с токеном-носителем авторизации. На портале Azure я сделал:

  1. Создание новой службы приложений (testservice).
  2. При аутентификации / авторизации:
    • Аутентификация службы приложений -> Вкл.
    • Действие, которое необходимо выполнить, если запрос не прошел проверку подлинности -> Войдите в систему с Azure Active Directory. Установите для провайдеров аутентификации значение «Аутентификация Active Directory в режиме управления»: Express и создайте новое приложение AD Azure (зарегистрируйте новое приложение: testserviceapp)
    • Хранилище токенов -> Вкл.
  3. Регистрация приложений -> testserviceapp:
    • Аутентификация -> Интернет -> URI перенаправления: https://testservice.azurewebsites.net/.auth/login/aad/callback
    • Аутентификация -> Интернет -> Неявное предоставление -> Доступ токены: true, ID токены: true
    • Аутентификация -> Поддерживаемые типы учетных записей -> Только учетные записи в этом каталоге организации (... - Один арендатор)
    • Аутентификация -> Расширенные настройки -> Обработка приложение в качестве общедоступного c клиента: Нет
    • Сертификаты и секреты -> создать новый ClientSecret
    • Предоставить API -> Добавить область действия: https://testservice.azurewebsites.net/user_impersonation
    • Предоставление API -> Добавление области: https://testservice.azurewebsites.net/WeatherForecast

Затем я создал проект RestApiService в VisualStudio и опубликовал sh в Azure. appsettings. json в моем хосте RestApiService:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "AzureAd": {
    "ClientId": "xxx",
    "Domain": "xxx.onmicrosoft.com",
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "xxx",
    "CallbackPath": "/signin-oidc",
    "ClientSecret": "xxx",
    "AppIDURL": "https://testservice.azurewebsites.net",
    "ConfigView": "API"
  }
}

WeatherForecastController.cs:

 [ApiController]
    [Route("[controller]")]
    [Authorize]
    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()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }

Startup.cs:

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme).AddAzureAdBearer(options => Configuration.Bind("AzureAd", options));
            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();
            });
        }
    }

В клиентском приложении я успешно get AccessToken:

static AuthToken GetToken()
        {
            var uri = "https://login.microsoftonline.com/";
            var method = $"{TenantID}/oauth2/token";
            var client = new RestClient(uri);
            var request = new RestRequest($"{uri}{method}", Method.POST);
            request.AddParameter("grant_type", "client_credentials");
            request.AddParameter("client_id", ClientID);
            request.AddParameter("client_secret", ClientSecret);
            request.AddParameter("resource", "https://testservice.azurewebsites.net/");
            return client.Execute<AuthToken>(request).Data;
        }

Но когда я пытаюсь вызвать API с этим токеном, я получаю 401 Несанкционированная ошибка (У вас нет прав для просмотра этого каталога или страницы.):

 static void GetItems(string token)
    {
        var client = new RestClient("https://testservice.azurewebsites.net/");
        var request = new RestRequest("https://testservice.azurewebsites.net/WeatherForecast", Method.GET);
        request.AddHeader("Authorization", $"bearer {token}");
        var response = client.Execute(request);
    }

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

...