Атрибут авторизации Web API с Azure AD, возвращающий 401 Unauthorized для приложения-демона - PullRequest
0 голосов
/ 12 апреля 2020

Я следую этому руководству о том, как настроить мой ASP. NET Core Web API с Azure AD Auth для вызова моего клиента приложения-демона.

Я полагаю, что я все настроил в соответствии с руководством, но когда я получаю токен и вызываю свой API, я все равно получаю 401, возвращаемых на контроллере с атрибутом [Authorize].

Я должен что-то упустить. Вот соответствующий код:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
...
    services
        .AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme)
        .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

    services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
    {
        options.TokenValidationParameters.ValidAudiences = new[]
        {
            options.Audience, // my-api-client-id-guid
            Configuration["AadAudienceUrl"], // https://myapi.azurewebsites.net
        };
    }
...
}

public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
    app.UseAuthorization();
...
}

appsettings. json

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "my-api-client-id-guide",
    "TenantId": "my-tenant-id-guid"
},

MyController.cs

[Authorize] // No role checks yet, just want to get basic auth working first
[ApiController]
[Route("mycontroller")]
public class MyController : ControllerBase
{
...
}

Код клиента для получения токена:

AuthenticationContext ac = new AuthenticationContext(
      authority: "https://login.microsoftonline.com/my-tenant-id-guid",
      validateAuthority: true);
AuthenticationResult ar = await ac.AcquireTokenAsync(
  "my-api-client-id-guid", 
  // "https://myapi.azurewebsites.net", // Both of these return a token successfully, but return 401 when used
  new ClientCredential("my-daemon-app-client-id-guid", "daemon-app-secret"));
var token = new AuthenticationHeaderValue(ar.AccessTokenType, ar.AccessToken);

Манифест для WebAPI:

"appRoles": [
  {
    "allowedMemberTypes": [
      "Application"
    ],
    "description": "Allow the application to access the service",
    "displayName": "Application Access",
    "id": "my-access-guid",
    "isEnabled": true,
    "lang": null,
    "origin": "Application",
    "value": "ApplicationAccess"
  }
],

Я предоставил приложению-демону это приложение Роль: enter image description here User assignment required? установлен на No для веб-API.

Чего мне не хватает, чтобы это успешно вернулось?

1 Ответ

1 голос
/ 13 апреля 2020

Вы должны добавить промежуточное программное обеспечение для аутентификации app.UseAuthentication();:

app.UseAuthentication();
app.UseAuthorization();

, чтобы промежуточное программное обеспечение JWT Bearer могло обрабатывать проверку токена и аутентифицировать пользователя.

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