Как авторизовать Swagger для использования MS Graph API - PullRequest
5 голосов
/ 20 марта 2019

Мы создаем оболочку Web API для MS Graph API.

Я хочу использовать Swagger для тестирования моих API. Но я не могу получить правильную конфигурацию. Я продолжаю получать Плохой Запрос и никакой другой подсказки. Я не могу установить Fiddler или другие инструменты на этот корпоративный ноутбук, чтобы помочь мне провести расследование.

Вот ошибка enter image description here

А вот код для настройки Swagger:

app.UseSwaggerUi3WithApiExplorer(settings =>
{
    settings.GeneratorSettings.DefaultPropertyNameHandling = PropertyNameHandling.CamelCase;
    settings.PostProcess = document =>
    {
        document.Info.Title = "App title";
        document.Info.Description = "App description";
    };

    settings.OAuth2Client = new OAuth2ClientSettings
    {
        ClientId = [clientid]
        ClientSecret = [clientsecret]
        AppName = "app_name",
    };
    settings.OAuth2Client.AdditionalQueryStringParameters.Add("response_type", "code id_token");
    settings.OAuth2Client.AdditionalQueryStringParameters.Add("nonce", "AnyValueShouldBeRandom");

    settings.GeneratorSettings.DocumentProcessors.Add(new SecurityDefinitionAppender("Auth Token", new SwaggerSecurityScheme
    {
        Type = SwaggerSecuritySchemeType.OpenIdConnect,
        Description = "Swagger OAuth2",
        OpenIdConnectUrl = "https://login.microsoftonline.com/[tenantid]/v2.0/.well-known/openid-configuration",
        Flow = SwaggerOAuth2Flow.Implicit,
        AuthorizationUrl = "https://login.microsoftonline.com/[tenantid]/oauth2/v2.0/authorize",
        TokenUrl = "https://login.microsoftonline.com/[tenantid]/oauth2/v2.0/token",
        In = SwaggerSecurityApiKeyLocation.Header,

        Scopes = new Dictionary<string, string>
        {
            { "api://[api]/user_impersonation", "" },
            { "user.read", "" },
            { "openid", "" },
            { "email", "" },
            { "profile", "" },
            { "roles", "" }
        }
    }));

    settings.GeneratorSettings.OperationProcessors.Add(new OperationSecurityScopeProcessor("oauth2"));

});

У меня вопрос, что я делаю не так?

Я боролся с этим с этого утра. Любая помощь с благодарностью.

Спасибо!

ОБНОВЛЕНИЕ 3/21/2019

Я понял это.

изменить это с

Type = SwaggerSecuritySchemeType.OpenIdConnect

до

Type = SwaggerSecuritySchemeType.OAuth2

Я также удалил кучу вещей вроде строк ff

settings.OAuth2Client.AdditionalQueryStringParameters.Add("response_type", "code id_token");
settings.OAuth2Client.AdditionalQueryStringParameters.Add("nonce", "AnyValueShouldBeRandom");

Сейчас работает.

По крайней мере, снаружи.

Swagger говорит мне, что я уже аутентифицирован:

enter image description here

НО, когда я запускаю приложение, HttpContext.User.Identity.IsAuthenticated говорит мне, что я не.

Тот же вопрос: что я делаю не так?

1 Ответ

1 голос
/ 21 марта 2019

Наконец-то я могу ответить на свой вопрос.

В этот раз я не буду слишком усердным, потому что исправление было не очень очевидным, по крайней мере, для меня.

Видимо,

settings.GeneratorSettings.OperationProcessors

должен иметь соответствующий

settings.GeneratorSettings.DocumentProcessors

Отчасти это моя вина, если я недостаточно усердно гуглю или документы действительно не были так доступны.

Но эта строка

settings.GeneratorSettings.OperationProcessors.Add(new OperationSecurityScopeProcessor("oauth2"));

Требуется совпадение. Поэтому замените следующее

settings.GeneratorSettings.DocumentProcessors.Add(new SecurityDefinitionAppender("Auth Token", new SwaggerSecurityScheme

с

settings.GeneratorSettings.DocumentProcessors.Add(new SecurityDefinitionAppender("oauth2", new SwaggerSecurityScheme

Надеюсь, это поможет кому-то еще.

...