Я конвертирую простое веб-приложение и связанный веб-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, он будет работать, но пользовательский принципал не будет.