Невозможно получить конфигурацию из: '/.well-known/openid-configuration' при попытке проверить JWT - PullRequest
0 голосов
/ 13 марта 2020

Рассматриваемое приложение настроено так: есть служба внешнего интерфейса и служба внутреннего интерфейса. Бэкэнд-сервис зарегистрирован в Azure AD. Служба внешнего интерфейса использует clientId и tenantId зарегистрированного приложения для получения JWT через поток кода авторизации. Затем внешний интерфейс передает этот JWT в заголовок авторизации каждого запроса.

Следующим шагом является получение серверной службой проверки этого токена для предоставления доступа к его конечным точкам. Существует множество различных примеров, и мне трудно определить, что использовать. В настоящее время у меня есть это в Startup.cs:

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
                .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

С appsettings. json:

  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "https://myapi.azurewebsites.net",
    "TenantId": "xxxxx-xxxxxxxx.xxxxxxx.xxxxxx",
    "IssuerId": "https://login.microsoftonline.com/xxxxxx-xxxxxx-xxxxx-xxxx",
    "ClientId": "xxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxx"
  }

Когда я пытаюсь использовать почтальон для вызова конечной точки с JWT в заголовке I получить следующую ошибку:

System.InvalidOperationException: IDX20803: Unable to obtain configuration from: 'https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration'.
 ---> System.IO.IOException: IDX20804: Unable to retrieve document from: 'https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration'.
 ---> System.Net.Http.HttpRequestException: Resource temporarily unavailable
 ---> System.Net.Sockets.SocketException (11): Resource temporarily unavailable
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel)
   --- End of inner exception stack trace ---
   at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel)
   at Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(String address, IDocumentRetriever retriever, CancellationToken cancel)
   at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.GetConfigurationAsync(CancellationToken cancel)
   --- End of inner exception stack trace ---
   at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.GetConfigurationAsync(CancellationToken cancel)
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
   at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Я понятия не имею, что это значит или как это исправить. Некоторые сайты предлагают указать metadataAdress, но они не сообщают вам, что указывать или где его размещать. У кого-нибудь есть опыт работы с этой ошибкой?

1 Ответ

0 голосов
/ 16 марта 2020

Согласно моему тесту, если вы хотите защитить свой веб-API с помощью Azure AD, пожалуйста, выполните следующие шаги

  1. Зарегистрируйте приложение Web API в Azure AD

  2. Настройте область действия API enter image description here

  3. Зарегистрируйте клиентское приложение в Azure AD

    a. Зарегистрировать заявку

    б. Создать секрет клиента enter image description here

    c. Настроить разрешения API enter image description here

  4. Настроить приложение

    a. appsettings. json

    "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "<your azure ad tenant id>",
    "Domain": "<your azure ad domain>",
    "ClientId": "<you web api appid>"
    
    },
    

    b. Добавьте следующий код в startup.cs.

    • Метод ConfigureServices

       public void ConfigureServices(IServiceCollection services)
      {
         var tenatId = Configuration["AzureAd:TenantId"];
         services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme)
       .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
         services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
         {
             // This is a Microsoft identity platform web API.
             options.Authority += "/v2.0";
             options.TokenValidationParameters.ValidIssuers = new[] {
      
               $"https://sts.windows.net/{tenatId}/",
               $"https://login.microsoftonline.com/{tenatId}/v2.0"
      
             };
      
             // The web API accepts as audiences both the Client ID (options.Audience) and api://{ClientID}.
             options.TokenValidationParameters.ValidAudiences = new[]
             {
                  options.Audience,
                  $"api://{options.Audience}"
             };
      
         });
      ...
      }
      
    • Метод настройки

       ...
      app.UseRouting();
      app.UseAuthentication();
      app.UseAuthorization();
       ...
      
  5. Тест

enter image description here
enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...