Nano Hash - криптовалюты, майнинг, программирование

Как интегрировать Swagger с Azure Active Directory OAuth

Я пытаюсь настроить 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 было присвоено значение «aud» идентификатору клиента приложения. В конечной точке V2 для параметра aud устанавливается значение, которое, как мне кажется, является ресурсом Graph API "00000003-0000-0000-c000-000000000000". Я считаю, что это моя проблема на данный момент, хотя я не уверен на 100%. У конечных точек V2, похоже, нет способа определить аудиторию, как это сделал V1, если, конечно, не будет некоторого надзора с моей стороны.

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

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

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. Любая помощь или направление будут приняты с благодарностью.


  • возможно, это поможет stackoverflow.com/questions/55256926/ 25.04.2019
  • Спасибо, Йокаб, сейчас я просматриваю ваш пост, чтобы узнать, могу ли я заметить что-нибудь, что помогает. Я читал документацию AAD, чтобы попытаться лучше понять процесс, и теперь могу подтвердить, что «aud» действительно должен соответствовать моему идентификатору клиента. Так что это будет первая проблема, которую нужно решить (docs.microsoft.com/en-us/azure/active-directory/develop/) - просто добавляю это ради интереса 25.04.2019

Ответы:


1

В итоге я решил проблему, которая у меня была. Работа с этим сообщением Помог мне понять свои ошибки.

Первой ошибкой была моя фактическая регистрация в приложении AAD. Я не установил область действия приложения в разделе «Разоблачать API». Поскольку в версии 2 не рекомендуется использовать свойство ресурса, для установки ресурса необходимо создать область в формате api "// {application 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" }
                   }
                });

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

30.04.2019

2

для конечной точки v2 обновите accessTokenAcceptedVersion в манифесте AAD с нуля до 2. Это будет работать.

25.05.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..