Как интегрировать сваггер с OAuth Azure Active Directory - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь настроить Swagger в своем приложении AspNetCore 2.1 с помощью Azure Active Directory V2, но, похоже, я не могу понять, что это правильно.Я могу настроить установку так, чтобы swagger запрашивал, перенаправлял и успешно аутентифицировал моего клиента / пользователя, но при передаче токена носителя на сервер выдает ошибку Bearer error="invalid_token", error_description="The signature is invalid".Я создал GitHub-репозиторий с проектом, который я пытаюсь заставить работать со всей его конфигурацией (https://github.com/alucard112/auth-problem)

Мне удалось заставить работать конечную точку V1, установив для ресурса идентификатор клиента AADприложение, которое приводит к тому, что для токена JWT в качестве идентификатора клиента установлен идентификатор клиента приложения. В конечной точке V2 для параметра aud устанавливается то, что я считаю ресурсом API Graph '00000003-0000-0000-c000-000000000000«Я считаю, что это моя проблема на данный момент, хотя я не уверен на 100%. Конечные точки V2, похоже, не имеют возможности определить аудиторию, как это сделал V1, если, конечно, с моей стороны нет некоторого контроля».1005 *

Мой файл запуска имеет следующую структуру:

Аутентификация настроена следующим образом:

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


            services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
            {
                options.Authority = $"https://login.microsoftonline.com/{tenantId}";
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    // In multi-tenant apps you should disable issuer validation:
                    ValidateIssuer = false,
                    // In case you want to allow only specific tenants,
                    // you can set the ValidIssuers property to a list of valid issuer ids
                    // or specify a delegate for the IssuerValidator property, e.g.
                    // IssuerValidator = (issuer, token, parameters) => {}
                    // the validator should return the issuer string
                    // if it is valid and throw an exception if not
                };
            });

И чванство настроено следующим образом:

 services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info
                {
                    Title = "Protected Api",
                });

                c.OperationFilter<SecurityRequirementsOperationFilter>();

                //IMATE - StevensW
                // Define the OAuth2.0 scheme that's in use (i.e. Implicit Flow)
                c.AddSecurityDefinition("oauth2", new OAuth2Scheme
                {
                    Type = "oauth2",
                    Flow = "implicit",
                    AuthorizationUrl = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize",
                    TokenUrl = $"https://login.microsoftonline.com/common/{tenantId}/v2.0/token",
                    Scopes = new Dictionary<string, string>
                   {
                       { "openid", "Unsure" },
                       { "profile", "Also Unsure" }
                   }
                });
            });
 app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
                c.OAuthClientId(Configuration.GetValue<string>("AzureAd:ClientId"));
                c.OAuthAppName("Protected API");

                //c.OAuthUseBasicAuthenticationWithAccessCodeGrant();
                //c.OAuthClientSecret(Configuration.GetValue<string>("AzureAd:ClientId"));
            });

Я надеюсь настроить пользовательский интерфейс Swagger на использование конечной точки AAD V2 и разрешить многопользовательский вход в систему, который позволяет успешно выполнять аутентифицированные вызовы API.р или направление будет принята с благодарностью.

1 Ответ

0 голосов
/ 30 апреля 2019

Я решил проблему, с которой столкнулся.Проработка этого поста помогла мне понять мои ошибки.

Первой ошибкой была моя фактическая регистрация в приложении AAD.Я не установил область для приложения в разделе «Expose a API».Поскольку они устарели в ресурсном свойстве ресурса V2, вы могли бы задать ресурс для создания области действия в формате api "// {ID приложения} / {scope_name}. После внесения этого изменения мое AAD-приложение теперь было правильно настроено.

После этого мне нужно было добавить дополнительный раздел в мой файл запуска:

return services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
             {
                 // This is an Azure AD v2.0 Web API
                 options.Authority += "/v2.0";

                 // The valid audiences are both the Client ID (options.Audience) and api://{ClientID}
                 options.TokenValidationParameters.ValidAudiences = new string[] { options.Audience, $"api://{options.Audience}" };


                 options.TokenValidationParameters.ValidateIssuer = false;
             });

Примечание: приведенная выше ссылка предоставила альтернативное решение для отключения проверки эмитента, если кто-либоЗаинтересованы.

Мой файл AppSettings также был упрощен за счет того, что ему нужно было только определить Instance, TenantId и ClientId.

Затем, с точки зрения подмены, мне просто нужно было добавить дополнительную область безопасностиопределение, совпадающее с тем, которое я создал в своем приложении AAD.

          c.AddSecurityDefinition("oauth2", new OAuth2Scheme
                {
                    Type = "oauth2",
                    Flow = "implicit",
                    AuthorizationUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
                    TokenUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/token",
                    Scopes = new Dictionary<string, string>
                   {
                       { "openid", "Sign In Permissions" },
                       { "profile", "User Profile Permissions" },
                       { $"api://{clientId}/access_as_user", "Application API Permissions" }
                   }
                });

После этих изменений мое приложение теперь работает должным образом.

...