Я разрабатываю одно приложение, в котором есть несколько арендаторов, и у каждого арендатора есть собственная конфигурация провайдера идентификации, что означает, что у одного есть Azure AD, а у другого - okta.
Я реализовал двухэтапный вход в систему: первый пользователь будет вводить имя пользователя и адрес электронной почты, с помощью которых мы будем идентифицировать арендатора и его провайдера идентификации. Если у пользователя есть настройка провайдера идентификации, мы перенаправим на конечную точку аутентификации провайдера, в противном случае пользователь сможет выполнить локальный вход.
Я пытался реализовать описанный выше сценарий с использованием OpenId Connect. Использовал OnRedirectToIdentityProvider для переопределения OpenIdConnectAuthenticationOptions для перенаправления в конечную точку аутентификации согласно арендатору
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
RedirectUri = redirectUri,
PostLogoutRedirectUri = PostLogoutUri,
Scope = OpenIdConnectScope.OpenIdProfile,
ResponseType = OpenIdConnectResponseType.IdToken,
TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = false
},
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
RedirectToIdentityProvider = OnRedirectToIdentityProvider,
SecurityTokenValidated = (context) =>
{
return Task.FromResult(0);
}
},
RequireHttpsMetadata = false
});
private static Task OnRedirectToIdentityProvider(RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
{
notification.ProtocolMessage.ClientId = "XXXXXXXXXXX";
notification.ProtocolMessage.IssuerAddress = "https://XXX- XXXXX.XXX.com/oauth2/default/v1/authorize";
notification.ProtocolMessage.RedirectUri = "http://localhost:XXXX/Home/Callback";
notification.ProtocolMessage.PostLogoutRedirectUri = "http://localhost:XXXX/";
notification.ProtocolMessage.Scope = OpenIdConnectScope.OpenIdProfile;
notification.ProtocolMessage.ResponseType = OpenIdConnectResponseType.Code;
}
Используя приведенный выше код, я могу перенаправить на конечную точку аутентификации, используя переопределенные настройки, но SecurityTokenValidated метод не срабатывает или я не получаю токен аутентификации.
Может ли кто-нибудь подсказать мне, правильный ли мой подход или какой-либо другой подход для достижения этой цели?