Активировать аутентификацию Azure Ad, когда вы нажмете https://host:port/swagger в сети Core 2 Api? - PullRequest
0 голосов
/ 06 сентября 2018

Я делаю все изменения в своем API для использования Azure Ad с этой и этой функцией связи, но когда API развернут, мне нужно, чтобы пользователь получил URL https://myapi.com/swagger (например), чтобы перенаправить его в Azure Ad login, затем узнать, есть ли у клиента права на использование этого API или нет, и перенаправить его снова в мой API и показать точки доступа, к которым он имеет доступ.

Я внесу некоторые изменения в startup.cs, чтобы использовать OpenIdConnect

  //Add AddAzureAdBearer Auth options
        services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            options.DefaultAuthenticateScheme = OpenIdConnectDefaults.AuthenticationScheme;
            //options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddOpenIdConnect(option =>
        {
            option.ClientId = Client;
            option.Authority = $"{Instance}/{Tenant}";
            option.SignedOutRedirectUri = "https://localhost:44308";
            option.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
            option.SaveTokens = true;

            option.Events = new OpenIdConnectEvents
            {
                OnRemoteFailure = context =>
                {
                    context.HandleResponse();
                    return Task.CompletedTask;
                }
            };

        })
        .AddCookie()
       .AddAzureAdBearer(options => _configuration.Bind("Ad", options));

И я добавляю HomeController для перенаправления на пользовательский интерфейс Swagger:

[Authorize]
        public class HomeController : Controller
        {
            [HttpGet("")]
            public ActionResult Index()
            {
                return Redirect("~/swagger");
            }
        }

Когда я запускаю API, он работает, как указано, но когда вы пишете https://{host:port}/swagger, он не работает, не запускает процесс аутентификации и автоматически переходит на https://{host:port}/swagger/index.html.

Как я могу это исправить?

Я работаю с Net Core 2.0 и Swashbuckle для Swagger.

1 Ответ

0 голосов
/ 26 сентября 2018

Вам необходимо добавить поддержку Swagger в ConfigureServices(IServiceCollection services) и Configure(IApplicationBuilder app, IHostingEnvironment env) в файле Startup.cs вашего приложения. Для этого вам нужно создать класс SwaggerServiceExtensions и добавить необходимый код для поддержки Swagger в вашем приложении.

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Swashbuckle.AspNetCore.Swagger;

namespace JwtSwaggerDemo.Infrastructure
{
    public static class SwaggerServiceExtensions
    {
        public static IServiceCollection AddSwaggerDocumentation(this IServiceCollection services)
        {
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1.0", new Info { Title = "Main API v1.0", Version = "v1.0" });

                c.AddSecurityDefinition("Bearer", new ApiKeyScheme
                {
                    Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                    Name = "Authorization",
                    In = "header",
                    Type = "apiKey"
                });
            });

            return services;
        }

        public static IApplicationBuilder UseSwaggerDocumentation(this IApplicationBuilder app)
        {
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1.0/swagger.json", "Versioned API v1.0");

                c.DocExpansion("none");
            });

            return app;
        }
    }
}

Изменения в файле Startup.cs

Используя вышеописанный класс, единственное, что вам нужно сделать в файле Startup.cs, это:

namespace JwtSwaggerDemo
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            //... rest of services configuration
            services.AddSwaggerDocumentation();

            //...
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                //.... rest of app configuration
                app.UseSwaggerDocumentation();
            }     
            //.... rest of app configuration
        }
    }
}

Авторизация запросов в Swagger UI Теперь, когда вы загружаете адрес пользовательского интерфейса Swagger (например: https://localhost:44321/swagger/#/),, вы увидите кнопку «Авторизовать» вверху. Нажатие на нее приводит к модальному окну, которое позволяет авторизовать ваше приложение с помощью токена JWT, добавление носителя в поле ввода значения.

...