У нас есть веб-приложение, которому требуется аутентифицированный доступ к нескольким веб-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 равен нулю?