Как работает аутентификация swagger?

Привет, я разработал пользовательский интерфейс Swagger для своего основного веб-приложения .net. Я добавил к нему аутентификацию. Я зарегистрировал два приложения в своем Azure AD. Один для Swagger и один для основного приложения Back end .Net. Ниже мой код.

services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });

                c.AddSecurityDefinition("oauth2", new OAuth2Scheme
                {
                    Type = "oauth2",
                    Flow = "implicit",
                    AuthorizationUrl = swaggerUIOptions.AuthorizationUrl,
                    TokenUrl = swaggerUIOptions.TokenUrl
                });
                c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
                {
                        { "oauth2", new[] { "readAccess", "writeAccess" } }
                });
            });

В приведенном выше коде я указываю тип и поток. Также указывается AuthorizationUrl и URL-адрес токена. При переходе к областям действия, если я добавляю области действия, это означает, что у моего Swagger есть доступ к добавленным областям или у моего back-end api есть доступ к этим областям? Тогда у меня есть код ниже.

c.OAuthClientId(swaggerUIOptions.ClientId);
                c.OAuthClientSecret(swaggerUIOptions.ClientSecret);
                c.OAuthRealm(azureActiveDirectoryOptions.ClientId);
                c.OAuthAppName("Swagger");
                c.OAuthAdditionalQueryStringParams(new { resource = azureActiveDirectoryOptions.ClientId });
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");

Когда мы разрабатываем Swagger, мы получаем токен доступа для приложения Swagger или серверного приложения? Также у меня есть c.OAuthRealm и я передаю идентификатор клиента серверного приложения. Что на самом деле делает эта строка кода? Также, когда я добавляю атрибут [Authorize] в верхней части моего API, а затем, если я пытаюсь напрямую нажать api, это не сработает. Он будет работать только после аутентификации. Итак, как именно работает атрибут Authorize? Может ли кто-нибудь помочь мне разобраться в этих вещах? Любая помощь будет оценена по достоинству. Спасибо


person Niranjan    schedule 16.01.2020    source источник
comment
Вы проверяли мой блог по этой теме? :) joonasw.net/view/ Хотя, полагаю, ваш для Swashbuckle 2.x? Однако общие идеи остались прежними.   -  person juunas    schedule 16.01.2020


Ответы (1)


Чтобы узнать, как настроить Swagger для проверки подлинности в Azure AD, выполните следующие действия.

  • Настройте Azure AD для своего веб-API. Дополнительные сведения см. В документ

    а. Создание приложения веб-API Azure AD

    б. Открыть API  введите здесь описание изображения

    c. Настроить код

    1. config file
"AzureAd": {
 "Instance": "https://login.microsoftonline.com/",
 "ClientId": "[Client_id-of-web-api-eg-2ec40e65-ba09-4853-bcde-bcb60029e596]",

 "TenantId": "<your tenant id>"
},
  1. Добавьте следующий код в Stratup.cs
 services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
                .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

  • Настроить чванство. Дополнительные сведения см. В блог.

    а. Создать веб-приложение Azure

    введите здесь описание изображения  введите описание изображения здесь  введите описание изображения здесь

    б. Настройте разрешения API. Относительно того, как настроить, вы можете обратиться к документ

    c. код

    1. Install SDK
    <PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
    
    1. Добавьте следующий код в Startup.cs в методе ConfigureServices:
    services.AddSwaggerGen(c =>
    {
    c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
    c.AddSecurityDefinition("oauth2", new OAuth2Scheme
    {
    Type = "oauth2",
    Flow = "implicit",
    AuthorizationUrl = $"https://login.microsoftonline.com/{Configuration["AzureAD:TenantId"]}/oauth2/authorize",
    Scopes = new Dictionary<string, string>
    {
     { "user_impersonation", "Access API" }
    }
    });
    c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
    {
    { "oauth2", new[] { "user_impersonation" } }
    });
    });
    
    1. Добавьте следующий код в метод Configure:
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
    c.OAuthClientId(Configuration["Swagger:ClientId"]);
    c.OAuthClientSecret(Configuration["Swagger:ClientSecret"]);
    c.OAuthRealm(Configuration["AzureAD:ClientId"]);
    c.OAuthAppName("My API V1");
    c.OAuthScopeSeparator(" ");
    c.OAuthAdditionalQueryStringParams(new { resource = Configuration["AzureAD:ClientId"] });
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    });
    
    
person Jim Xu    schedule 17.01.2020