AcquireTokenSilent для нескольких токенов доступа к WebAPI с использованием Azure B2 C и MSAL.NET - PullRequest
1 голос
/ 03 февраля 2020

У нас есть веб-приложение, которому требуется аутентифицированный доступ к нескольким веб-API. Для аутентификации мы используем Azure AD B2 C.

Я понимаю, что вы не можете включать области для обоих ресурсов в один вызов.

Я понимаю, что MSAL должен использовать токен refre sh, который был кэширован из первого токена ресурса, для запроса токена доступа для второго ресурса.

IConfidentialClientApplication cca = MsalAppBuilder.BuildConfidentialClientApplication();
var accounts = await cca.GetAccountsAsync();
AuthenticationResult result = await cca.AcquireTokenSilent(scopeForApi2, accounts.FirstOrDefault())

Когда это вызов сделан, вызов не прерывается, но токен доступа не имеет значения.

В пределах Azure B2 C веб-приложение и веб-страницы зарегистрированы - и веб-приложение получило разрешение и Администратор дает согласие на все области из веб-сайта.

Поддерживается ли это с использованием Azure AD B2 C и / или MSAL. NET?

Мы получаем первый токен доступа для Первый ресурс API успешно:

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        // Generate the metadata address using the tenant and policy information
        MetadataAddress = String.Format(Globals.WellKnownMetadata, Globals.Tenant, Globals.DefaultPolicy),

        // These are standard OpenID Connect parameters, with values pulled from web.config
        ClientId = Globals.ClientId,
        RedirectUri = Globals.RedirectUri,
        PostLogoutRedirectUri = Globals.RedirectUri,

        // Specify the callbacks for each type of notifications
        Notifications = new OpenIdConnectAuthenticationNotifications
        {
            RedirectToIdentityProvider = OnRedirectToIdentityProvider,
            AuthorizationCodeReceived = OnAuthorizationCodeReceived,
            AuthenticationFailed = OnAuthenticationFailed,
        },

        // Specify the claim type that specifies the Name property.
        TokenValidationParameters = new TokenValidationParameters
        {
            NameClaimType = "name",
            ValidateIssuer = false
        },

        // Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
        Scope = $"openid profile offline_access {Globals.ReadTasksScopeApi1} {Globals.WriteTasksScopeApi1}"
    }
);

мы получаем первый токен доступа, используя код авторизации - мы получаем токен доступа и refre sh токен

IConfidentialClientApplication confidentialClient 
     = MsalAppBuilder.BuildConfidentialClientApplication(
        new ClaimsPrincipal(notification.AuthenticationTicket.Identity));

// Upon successful sign in, get & cache a token using MSAL
AuthenticationResult result = await confidentialClient
    .AcquireTokenByAuthorizationCode(Globals.Scopes_Api1, notification.Code)
    .ExecuteAsync();

Я также попытался добавить параметр запроса «resource», но, похоже, он не имеет никакого значения:

var scope = new string[] { Globals.ReadTasksScopeApi2 };


IConfidentialClientApplication cca = MsalAppBuilder.BuildConfidentialClientApplication();
var accounts = await cca.GetAccountsAsync();
AuthenticationResult result = await cca.AcquireTokenSilent(scope, accounts.FirstOrDefault())
.WithExtraQueryParameters(new Dictionary<string, string>
{
   // { "resource", "https://myb2c.onmicrosoft.com/api2" },    // tried appid and guid
    { "resource", "0a6ab6b5-1b88-49fe-a6cf-19f1878d3508" }
})
.ExecuteAsync();

Почему токен доступа для второго вызова AcquireTokenSilent для второго ресурса с использованием Azure AD B2 C равен нулю?

1 Ответ

0 голосов
/ 19 февраля 2020

2/19/2020

С инженером поддержки Azure я подтвердил, что Azure AD B2 C не поддерживает такой сценарий.

...