Во-первых, вам нужно запросить области, необходимые для доступа к вашему API, при вызове AcquireTokenSilentAsync
AuthenticationResult result = await cca.AcquireTokenSilentAsync(scope, cca.Users.FirstOrDefault(), AzureAdB2COptions.Authority, false);
И вам необходимо реализовать первоначальное получение токенов и сохранить токены в кэше токенов MSAL, используя AuthorizationCodeReceived
уведомление о промежуточном программном обеспечении авторизации:
public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
{
// Use MSAL to swap the code for an access token
// Extract the code from the response notification
var code = context.ProtocolMessage.Code;
string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, context.HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
try
{
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, AzureAdB2COptions.ApiScopes.Split(' '));
context.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
catch (Exception ex)
{
//TODO: Handle
throw;
}
}
Чтобы при получении токена в контроллере MSAL проверял кеш и возвращал любой кэшированный токен, который соответствует требованию. Если срок действия таких токенов доступа истек или отсутствуют подходящие токены доступа, но есть связанный токен обновления, MSAL автоматически использует его для получения нового токена доступа и его прозрачного возврата:
// Retrieve the token with the specified scopes
var scope = AzureAdB2COptions.ApiScopes.Split(' ');
string signedInUserID = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, this.HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
AuthenticationResult result = await cca.AcquireTokenSilentAsync(scope, cca.Users.FirstOrDefault(), AzureAdB2COptions.Authority, false);
Здесь - пример кода с использованием ASP.NET Core 2.0 и MSAL 2, пожалуйста, прочитайте README.md
для подробного объяснения.
Также можно щелкнуть здесь для примера кода, который аутентифицирует пользователя в Azure AD B2C и получает токен доступа с помощью MSAL.NET с использованием ASP.NET Core 2.1.