В нашем приложении MVC 5 мы используем OpenIdConnect и пытаемся использовать несколько Azure B2 C AD политик:
1) Политика входа, используемая для единого входа в систему
2) Политика входа, используемая для проверки доступа к API
Параметры аутентификации единого входа настраиваются с помощью этого кода:
OpenIdConnectAuthenticationOptions options = new OpenIdConnectAuthenticationOptions();
options.MetadataAddress = string.Format(_aadInstance, _tenant, config.Policy);
//options.AuthenticationType = GetAuthenticationType();
options.AuthenticationType = config.Policy;
options.AuthenticationMode = AuthenticationMode.Passive;
options.RedirectUri = config.AzureReplyUri;
options.PostLogoutRedirectUri = config.LogoutRedirectUri;
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "emails"
};
var identityProvider = GetIdentityProvider();
options.Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthenticationFailed = AuthenticationFailed,
RedirectToIdentityProvider = notification =>
{
return Task.FromResult(notification.ProtocolMessage.UiLocales = config.UiLocale ?? string.Empty);
},
SecurityTokenValidated = notification =>
{
notification.AuthenticationTicket.Identity.AddClaim(new Claim("idp", "azureadb2c"));
// transform all claims
ClaimsIdentity identity = notification.AuthenticationTicket.Identity;
notification.AuthenticationTicket.Identity.ApplyClaimsTransformations(new TransformationContext(FederatedAuthenticationConfiguration, identityProvider));
return Task.CompletedTask;
}
};
// These are standard OpenID Connect parameters, with values pulled from web.config
options.ClientId = config.ClientId;
//http://openid.net/specs/openid-connect-core-1_0.html#AuthRequest
options.Scope = "openid";
//http://openid.net/specs/openid-connect-core-1_0.html#Authentication
options.ResponseType = "id_token";
return options;
Параметры аутентификации API настраиваются с использованием этого кода :
OpenIdConnectAuthenticationOptions options = new OpenIdConnectAuthenticationOptions();
options.MetadataAddress = string.Format(_aadInstance, _tenant, _policy);
options.AuthenticationType = _policy;
options.AuthenticationMode = AuthenticationMode.Passive;
options.RedirectUri = _redirectUri;
options.PostLogoutRedirectUri = _logoutUri;
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "emails"
};
options.Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthenticationFailed = AuthenticationFailed,
SecurityTokenValidated = notification =>
{
notification.AuthenticationTicket.Identity.AddClaim(new Claim("api-access-token", notification.ProtocolMessage.AccessToken));
return Task.CompletedTask;
}
};
// These are standard OpenID Connect parameters, with values pulled from web.config
options.ClientId = _clientId;
//http://openid.net/specs/openid-connect-core-1_0.html#AuthRequest
options.Scope = _scopes;
//http://openid.net/specs/openid-connect-core-1_0.html#Authentication
options.ResponseType = OpenIdConnectResponseType.IdTokenToken;
return options;
Я могу получить маркер доступа в событии SecurityTokenValidated и добавить его к текущей заявке на удостоверение личности.
Однако, когда я позже получу все заявки, используя ClaimsPrincipal.Current.Claims
, токен доступа отсутствует.
Кажется, что ClaimsIdentities отличаются - при использовании политики входа в систему единого входа у меня одна заявка, но при использовании политики API - другая заявка.
1) Верны ли мои наблюдения? В игре несколько заявлений?
2) Можно ли добавить заявки к одному и тому же ClaimsPrincipal при использовании нескольких политик входа в систему?