ClaimsPrincipal изменения с несколькими Azure B2 C AD политики - PullRequest
0 голосов
/ 13 января 2020

В нашем приложении 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 при использовании нескольких политик входа в систему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...