У меня возникли некоторые проблемы после внесения некоторых изменений в Образец решения IdentityServer4 Quickstart , в частности образец 8_AspNetIdentity.
Я предвожу это, говоря, что не уверен, что чтоЯ пытаюсь сделать, просто не поддерживается, или если я делаю это неправильно.
Этот пример решения содержит следующие проекты, относящиеся к моему вопросу:
- a IdentityServer,
- клиент MVC (с именем MVCClient), который использует OpenIdConnect для аутентификации своих пользователей,
- клиент веб-API (с именем API), который использует аутентификацию на предъявителя для своих пользователей
- консольприложение (названное ResourceOwnerClient), предназначенное для клиента API
Что я пытаюсь сделать, это объединить проект API с MVCClient, чтобы MVCClient мог как аутентифицировать пользователей со своего сайта MVCс OIDC, а также с ResourceOwnerClient с использованием аутентификации на предъявителя.
Я внес следующие изменения в файл Startup.cs MVCClient:
изменено services.AddMvc();
на:
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder(new[]
{
JwtBearerDefaults.AuthenticationScheme,
CookieAuthenticationDefaults.AuthenticationScheme,
"oidc"
})
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
добавлены опции однонаправленного канала JWT к services.AddAuthentication()
:
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.Audience = "api1";
})
Теперь технически это сработало, поскольку и ResourceOwnerClient, и пользователи MVC могут успешно проходить аутентификацию с MVCClient.Однако у меня есть одно предупреждение:
Когда я аутентифицируюсь с пользователем со стороны MVC, я заметил, что у моего текущего пользователя есть две личности.Обе идентичны с точки зрения требований и т. Д. Это происходит только тогда, когда я ставлю точку останова в MVCClient, на IdentityServer есть только одна идентификационная информация.
На IdentityServer я зарегистрировал UserClaimsPrincipalFactory, который добавляет мои собственные пользовательские утверждения в ClaimsIdentity.В двух удостоверениях на IdentityServer я вижу дубликаты утверждений.Таким образом, вместо одного удостоверения с двумя настраиваемыми утверждениями, я вижу два удостоверения, каждое из которых имеет 4 настраиваемых утверждения.Метод CreateAsync в моем UserClaimsPrincipalFactory также получает удар 5 раз для одного входа в систему.
Хотя это поведение странное, похоже, что оно не оказывает каких-либо негативных последствий.Но это только доказательство концепции для более крупного приложения, которое я создаю, и я боюсь, что из-за него в будущем могут возникнуть проблемы.
Если кто-то пытался делать подобные вещи раньшеили знает, почему это может происходить, любая помощь будет принята.