Токен-носитель не включается в SwaggerUI

#asp.net-core #swagger-ui #aspnetboilerplate

#asp.net-core #swagger-пользовательский интерфейс #aspnetboilerplate

Вопрос:

Я использую стандартную платформу AspNet. Я пытаюсь реализовать аутентификацию через AzureAD в своем приложении. Я использую ASP.NET ядро 3.0 и тестирование моего приложения через swagger. Я вижу, что токен не включается в заголовок.

Метод запуска ConfigureServices().cs

                 {
                    Type = SecuritySchemeType.OAuth2,
                    Flows = new OpenApiOAuthFlows()
                    {
                        Implicit = new OpenApiOAuthFlow()
                        {
                            TokenUrl = new Uri(My Token Url),
                            AuthorizationUrl = new Uri(My Authorization Url),
                            Scopes = { { "api://357...../user_impersonation", "Access adt-service" } }
                        }
                    }
                });

 

Метод Configure() Startup.cs:

             {                
                options.OAuthClientId("22............");
                options.OAuthScopeSeparator(" ");
                
            });
 

Пожалуйста, дайте мне знать, если я что-то упустил.

Ответ №1:

Получаете ли вы токен в первую очередь при аутентификации? В моем ответе я предполагаю, что это так.

Вы не показываете это полностью в своем фрагменте, но вы должны делать что-то вроде приведенного ниже, чтобы настроить службы Swagger, верно?

 services.AddSwaggerGen(options =>
{
    options.SwaggerDoc(...);

    options.AddSecurityDefinition(
        "oauth",
        new OpenApiSecurityScheme
        {
            Type = SecuritySchemeType.OAuth2,
            Flows = new OpenApiOAuthFlows()
            {
                Implicit = new OpenApiOAuthFlow()
                {
                    TokenUrl = new Uri(My Token Url),
                    AuthorizationUrl = new Uri(My Authorization Url),
                    Scopes = { { "api://357...../user_impersonation", "Access adt-service" } }
                }
            }
    });
});
 

Если это так, просто добавьте требование безопасности в свои параметры, и токен уже будет включен в ваши запросы:

 services.AddSwaggerGen(options =>
{
    options.SwaggerDoc(...);

    options.AddSecurityDefinition(
        "oauth",
        new OpenApiSecurityScheme
        {
            Type = SecuritySchemeType.OAuth2,
            Flows = new OpenApiOAuthFlows()
            {
                Implicit = new OpenApiOAuthFlow()
                {
                    TokenUrl = new Uri(My Token Url),
                    AuthorizationUrl = new Uri(My Authorization Url),
                    Scopes = { { "api://357...../user_impersonation", "Access adt-service" } }
                }
            }
    });

    options.AddSecurityRequirement(
        new OpenApiSecurityRequirement {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference {
                    Type = ReferenceType.SecurityScheme,
                    Id = "oauth"
                }
            },
            oauthScopes.Keys.ToArray() // array with scopes' keys used above in the security definition
        }
    });
});
 

Пожалуйста, обратите внимание на добавление options.AddSecurityRequirement . Имя / идентификатор "oauth" — это просто идентифицирующее имя для определения безопасности.

Эти фрагменты работают для .net 5. Я полагаю, что они могут сделать это для .net core 3

Комментарии:

1. Эта строка была ключевой! oauthScopes.Keys. toArray() // массив с ключами областей, используемыми выше в определении безопасности. Я видел так много примеров, и это первый раз, когда я когда-либо видел какое-либо внимание, уделяемое этой строке, помимо new List<string>() . Спасибо. Он по-прежнему не закрывает значок блокировки, но возвращаемый id_token фактически принадлежит пользователю, а не только клиенту.