Активировать аутентификацию Azure Ad при нажатии https: // host: port / swagger в net Core 2 Api?

Я вношу все изменения в свой api, чтобы использовать Azure Ad с функциями ссылки это и это, но когда api развернут, мне нужно заставить пользователя, который получает URL-адрес https://myapi.com/swagger (например), перенаправить его на вход в Azure Ad, а затем знать если у клиента есть права или нет использовать этот 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 для чванства.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
500
1

Ответы 1

Вам необходимо добавить поддержку 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 Теперь, когда вы загружаете адрес пользовательского интерфейса Swagger (например, https: // локальный: 44321 / swagger / # /), вы увидите кнопку авторизации вверху. Щелчок по нему приводит к модальному окну, которое позволяет вам авторизовать ваше приложение с помощью токена JWT, добавив Bearer в поле ввода значения.

Я не это имел в виду. Этот ответ был первым подходом, который я использовал, но это не то, что я ищу. Мне нужно перенаправить на страницу входа в Microsoft, когда я ввожу адресную строку локальный: 44321 / swagger и нажимаю Enter. Прямо сейчас мой URL-адрес Api по умолчанию (локальный: 44321) перенаправляет меня на логин, но когда я добавляю / swagger, он не запрашивает логин и не показывает мне страницу api. Это моя проблема, я описываю код, который использую. Спасибо

ArlanG 29.09.2018 14:52

Другие вопросы по теме