.Net Core Web API аутентификация токенов-носителей с помощью ADFS 4 - PullRequest
0 голосов
/ 22 мая 2019

Я конвертирую простое веб-приложение и связанный веб-API, который защищен с использованием локальной ADFS, используя открытый идентификатор из .Net Framework 4.6.2, в .Net Core 2.0, но столкнулся с проблемой аутентификации в веб-API.

Я успешно преобразовал интерфейсное веб-приложение в .Net Core, и он без проблем вызывает старый API. Однако я не уверен, как настроить новый API для аутентификации на предъявителя.

Аутентификация в существующем API настраивается следующим образом:

public void ConfigureAuth(IAppBuilder app)
        {
            JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
            app.UseActiveDirectoryFederationServicesBearerAuthentication(
                new ActiveDirectoryFederationServicesBearerAuthenticationOptions
                {
                    MetadataEndpoint = ConfigurationManager.AppSettings["ida:AdfsMetadataEndpoint"],
                    TokenValidationParameters = new TokenValidationParameters() {
                        SaveSigninToken = true,
                        ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                    }
                });
        }

И я попытался настроить аутентификацию в новом API следующим образом:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddAuthentication(options =>
                {
                    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(options =>
                {
                    options.MetadataAddress = "xxx/adfs/.well-known/openid-configuration";
                    options.Authority = "xxx/adfs/";
                    options.TokenValidationParameters = new TokenValidationParameters
                    {

                        SaveSigninToken = true,
                        ValidAudiences = new List<string>
                        {
                            Configuration["http://localhost:64766/"],
                            Configuration["http://localhost:53797/"]
                        }
                    };
                });
        }

        // 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())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();
            app.UseAuthentication();
        }

При вызове старого API токен-носитель успешно анализируется, и доступ предоставляется без каких-либо проблем. Однако при вызове нового API я просто получаю ошибку 401. Если я удаляю атрибут [Authorize] из контроллера API, запрос выполняется успешно, но с запросом не связано ни одного пользователя, хотя я вижу маркер носителя в заголовке авторизации. Есть идеи, что мне не хватает?

Редактировать

Теперь я подключился к событиям JwtBearer, чтобы я мог видеть, что идет не так, и выясняется, что в моей конфигурации есть пара ошибок и не удается проверить аудиторию и издателя моего токена. Обновление кода до приведенного ниже исправило эту проблему.

options.TokenValidationParameters = new TokenValidationParameters
                    {

                        SaveSigninToken = true,
                        ValidIssuer = "xxx/adfs/services/trust",
                        ValidAudiences = new List<string>
                        {
                            "http://localhost:64766/",
                            "http://localhost:53797/"
                        },
                    };

Теперь, когда я вызываю API, я вижу, что событие OnTokenValidated вызывается и что пользовательский принципал корректен и аутентифицирован, однако я все еще получаю 401 несанкционированную ошибку при вызове API. Если я удалю атрибут [Authorize] из API, он будет работать, но пользовательский принципал не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...