Как настроить Swagger в .NET Core 2.2 WebApi и Azure AD 2.0? - PullRequest
2 голосов
/ 01 мая 2019

У меня проблема с функцией авторизации Swagger для аутентификации приложения WebApi с использованием конечной точки Azure AD 2.0. Я использовал следующие настройки в своем классе запуска, но полученный токен не может проверить токен носителя в Swagger. API отлично работает с токеном, отправленным клиентом реакции.

private const string AzureAdConfigKey = "AzureAd";
private const string OAuth2Definition = "openid";

private IConfiguration Configuration { get; }
private IHostingEnvironment Environment { get; }

public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
    Environment = environment;
    Configuration = configuration;
}

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

    services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme,
        options => options.Authority += "/v2.0");

    var authorizationPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();

    services.AddMvc(options => options.Filters.Add(new AuthorizeFilter(authorizationPolicy)))
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    var azureAdAuthority = $"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}/oauth2/v2.0";
    services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1", new Info
        {
            Title = "My Api Name",
            Version = "v1"
        });

        options.AddSecurityDefinition(OAuth2Definition, new OAuth2Scheme
        {
            Description = "OAuth2 Implicit Grant",
            Flow = "implicit",
            AuthorizationUrl = $"{azureAdAuthority}/authorize",
            TokenUrl = $"{azureAdAuthority}/connect/token",
            Scopes = new Dictionary<string, string>
            {
                {OAuth2Definition, "User.Read"}
            }
        });

        options.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> {{OAuth2Definition, null}});
    });

    services.AddCors(options => options.AddPolicy("AllowSpecificOrigin", builder => builder
        .WithOrigins(Configuration["MyAppClientUrl"])
        .AllowCredentials()
        .AllowAnyHeader()
        .AllowAnyMethod()
    ));

    // Other Service Registrations.
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseMiddleware<ErrorHandlingMiddleware>();

    app.UseCors("AllowSpecificOrigin");

    app.UseHsts();
    app.UseHttpsRedirection();

    app.UseSwagger();
    app.UseSwaggerUI(config =>
    {
        const string swaggerName = "MyApp Coding Api";
        const string swaggerUrl = "/swagger/v1/swagger.json";

        config.SwaggerEndpoint(swaggerUrl, swaggerName);
        config.RoutePrefix = string.Empty;

        config.OAuthAppName(swaggerName);
        config.OAuthClientId(Configuration["AzureAd:ClientId"]);
        config.OAuthClientSecret(Configuration["AzureAd:ClientSecret"]);
        // This is my Api local path.
        config.OAuthRealm("https://localhost:44398/swagger/ui/o2c-html");
        config.OAuthScopeSeparator(" ");
    });

    app.UseAuthentication();
    app.UseMvc();
}

Ниже приведен токен, сгенерированный клиентом, который отлично работает и реализует .v2.0:

{
  "aud": "{Excldued}",
  "iss": "https://login.microsoftonline.com/{Excldued}/v2.0",
  "iat": 1556730915,
  "nbf": 1556730915,
  "exp": 1556734815,
  "aio": "AVQAq/8LAAAA9lULrpdFyoAfnaWTCkdo8PMz2vL4C0MbDNAxmRBa3rMETsjpnXYFb5izdF/VRWMLzOvwgmw9Zt3zzisWRbLCFMd5KAaJ59wUDqNdSoawS6U=",
  "name": "{Excldued}",
  "nonce": "{Excldued}",
  "oid": "{Excldued}",
  "preferred_username": "{Excldued}",
  "roles": [
    "Coder",
    "Supervisor"
  ],
  "sub": "Jn0w0rhsGpwTKPdSjQBLHeHDv2_TD4kaOjo0x06JWKQ",
  "tid": "{Excldued}",
  "uti": "pOW4Q_EBdkSv_q0-OHRSAA",
  "ver": "2.0"
}

Но чванство генерирует следующий токен, который является .v1.0:

{
  "aud": "00000003-0000-0000-c000-000000000000",
  "iss": "https://sts.windows.net/{Excluded}/",
  "iat": 1556733552,
  "nbf": 1556733552,
  "exp": 1556737452,
  "acct": 0,
  "acr": "1",
  "aio": "AUQAu/8LAAAA9YXDyeK8KuCHbNgw7RGU8GgJk3qpWB1H+Q3i/dC/VRoAtYvp3NHFIYcTFxn3jfTPvvXRWx5MN35kvO0iCK7ftg==",
  "amr": [
    "pwd",
    "mfa"
  ],
  "app_displayname": "{Excluded}",
  "appid": "{Excluded}",
  "appidacr": "0",
  "family_name": "{Excluded}",
  "given_name": "{Excluded}",
  "ipaddr": "{Excluded}",
  "name": "{Excluded}",
  "oid": "{Excluded}",
  "onprem_sid": "{Excluded}",
  "platf": "3",
  "puid": "{Excluded}",
  "scp": "openid profile User.Read email",
  "signin_state": [
    "kmsi"
  ],
  "sub": "{Excluded}",
  "tid": "{Excluded}",
  "unique_name": "{Excluded}",
  "upn": "{Excluded}",
  "uti": "{Excluded}",
  "ver": "1.0",
  "xms_st": {
    "sub": "{Excluded}"
  },
  "xms_tcdt": 1361394419
}

Что я делаю неправильно в моей конфигурации Swagger, которая запрашивает конечную точку 1.0 и получает неправильный тип токена?

UPDATE:

Это запрос скрипача к конечной точке авторизации Azure AD:

GET https://login.microsoftonline.com/{TenantId}/oauth2/v2.0/authorize?response_type=token&client_id={ClientId}&redirect_uri=https%3A%2F%2Flocalhost%3A44350%2Foauth2-redirect.html&scope=openid&state={StateValue}&nonce=123456 HTTP/1.1
Host: login.microsoftonline.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
DNT: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: https://localhost:44350/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

1 Ответ

0 голосов
/ 17 июня 2019

Причина, по которой вы получаете токен v1.0, заключается в том, что вы пытаетесь получить доступ к ресурсу v1.0. Пожалуйста, смотрите статью здесь: https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens

Токены доступа создаются на основе аудитории токена, то есть приложения, которому принадлежат области действия в токене. Вот как настройка ресурса accessTokenAcceptedVersion в манифесте приложения для 2 позволяет клиенту, вызывающему конечную точку v1.0, получить токен доступа v2.0. Аналогичным образом, именно поэтому изменение необязательных утверждений маркера доступа для вашего клиента не меняет токен доступа, полученный при запросе токена для user.read, который принадлежит ресурсу MS Graph. По этой же причине при тестировании клиентского приложения с личной учетной записью (например, hotmail.com или outlook.com) вы можете обнаружить, что маркер доступа, полученный вашим клиентом, является непрозрачной строкой. Это связано с тем, что доступ к ресурсу запрашивал устаревшие билеты MSA (учетная запись Microsoft), которые зашифрованы и не могут быть поняты клиентом.

Ваш токен v1.0 имеет аудиторию для Microsoft Graph, который выдается конечной точкой v1.0. Если вы читаете статью здесь: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow Вы увидите, что даже при достижении конечной точки v2.0 и запросе токена доступа у Postman для ресурса graph.microsoft.com вы получите токен доступа, где iss не имеет версии 2.0.

Это также очень полезный ресурс, так как он является хорошей ссылкой на некоторые популярные GUID в Azure. : https://www.shawntabrizi.com/aad/common-microsoft-resources-azure-active-directory/

...