Я все еще изучаю Identity Framework и пытаюсь настроить аутентификацию в моем приложении .Net Core 2 MVC.Любые предложения приветствуются, поскольку я даже не уверен, что то, что я делаю, правильно.
У меня есть требование интегрировать провайдера идентификации OpenID Connect для аутентификации и использоватьвторичный источник данных для авторизации .Неудобно, что я не могу использовать какие-либо претензии от IdP OIDC, кроме претензии на имя.Остальные заявки пользователей должны поступать из вторичного источника данных (который подключен к Identity Framework через настраиваемый объект UserStore
и User
).
Я использую поставщика OpenId Connect для обработки аутентификации.Это работает нормально и дает мне первую личность (из которой я могу использовать только одну претензию).Моя путаница начинается, когда мне нужно получить второе удостоверение пользователя, добавить его к принципалу и установить его по умолчанию Identity
.Этот второй Identity
предоставляет все заявки пользователей, включая роль.
Я понимаю, что у меня есть структура удостоверений, что у меня должен быть один ClaimsPrincipal
с двумя удостоверениями, чтобы я мог подключиться к остальной части Identity Framework,Однако с двумя удостоверениями по умолчанию ClaimsPrincipal
автоматически выберет первое удостоверение (которое я не могу использовать), поэтому мне кажется, что я должен создать пользовательское ClaimsPrincipal
и установить PrimaryIdentitySelector
так что мой второй идентификатор является основным.
public class MyClaimsPrincipal : ClaimsPrincipal
{
private static readonly Func<IEnumerable<ClaimsIdentity>, ClaimsIdentity> IdentitySelector = SelectPrimaryIdentity;
/// <summary>
/// This method iterates through the collection of ClaimsIdentities and chooses an identity as the primary.
/// </summary>
private static ClaimsIdentity SelectPrimaryIdentity(IEnumerable<ClaimsIdentity> identities)
{
// Find and return the second identity
}
}
Как только я получаю проверенный токен из IIDP OIDC, я выбираю второй идентификатор, создаю новый MyClaimsPrincipal, добавляю два идентификатора к новому принципалу.После этого я не уверен, что делать с этим новым принципалом.
Я пытался зарегистрировать пользователя через SignInManager
, явно настроив пользователя в контексте HTTP и используя промежуточное ПО для преобразованияClaimsPrincipals
до MyClaimsPrincipals
но все это, похоже, ничего не делает.Я думаю, что упускаю суть.
Некоторые конкретные вопросы:
- Это лучший способ сделать это?Как правило, из-за этого все сложно понять, нахожусь ли я на правильном пути.
- Как только я создал пользовательский принципал, как мне «установить» его в контекст HTTP, чтобыэто постоянно?
- Как аутентификация Cookie работает с аутентификацией OpenId Connect?Похоже, что OIDC каким-то образом передает пользователя в проверку подлинности Cookie, и для работы проверки подлинности OIDC требуется добавление проверки подлинности cookie.