Получение токена, но не области внутри этого токена, с использованием кода MSAL
Я заменяю код AAD на MSAL.
Страница входа сначала заходит на Startup.cs
Здесь я генерирую токен, используя информацию о пользователе. Если сгенерированный токен я проверил с помощью кодировщика jwt, он показывает область действия.
Стартап.cs
var graphApiResource ="https://graph.microsoft.com/";
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(this.Configuration["Authentication:AzureAd:ClientId"])
.WithRedirectUri(x.Properties.Items[OpenIdConnectDefaults.RedirectUriForCodePropertiesKey])
.WithClientSecret(this.Configuration["Authentication:AzureAd:ClientSecret"])
.WithAuthority(this.Configuration["Authentication:AzureAd:AADInstance"] + this.Configuration["Authentication:AzureAd:TenantId"])
.Build();
var scopes = new string[] { $"{graphApiResource}/.default" };
AuthenticationResult authenticationResult;
authenticationResult = await app.AcquireTokenByAuthorizationCode(scopes, x.ProtocolMessage.Code).ExecuteAsync();
var token = authenticationResult.AccessToken;
Это работает отлично. После этого код start.cs был запущен из userinfo.cs, который генерирует токен, но поскольку я не передаю никаких данных пользователя при создании токена, сгенерированный токен не имеет области действия внутри него и не может его успешно использовать.
Пользовательская информация.cs
var graphApiResource ="https://graph.microsoft.com/";
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(this.configuration["Authentication:AzureAd:ClientId"])
.WithRedirectUri($"{this.httpContextAccessor?.HttpContext.Request.Scheme}://{this.httpContextAccessor?.HttpContext.Request.Host}{this.configuration["Authentication:AzureAd:CallbackPath"]}")
.WithClientSecret(this.configuration["Authentication:AzureAd:ClientSecret"])
.WithAuthority(this.configuration["Authentication:AzureAd:AADInstance"] + this.configuration["Authentication:AzureAd:TenantId"])
.Build();
var scopes = new string[] { $"{graphApiResource}/.default" };
AuthenticationResult authenticationResult;
authenticationResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();
var token = authenticationResult.AccessToken;
То, что должно быть сделано?
Детали разрешения:
Моя проблема в том, что раньше я использовал старый nuget, т.е. Microsoft. IdentityModel.Clients.ActiveDirectory
Код был таким -
private async Task<string> GetAuthorizationHeaderCore(string resource)
{
var objectId = (this.httpContextAccessor.HttpContext.User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;
var userTenantId = (this.httpContextAccessor.HttpContext.User.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid"))?.Value;
var distributedTokenCache = new DistributedTokenCache(
this.scopedCacheFactory,
this.dataProtectionProvider,
this.telemetryClient,
userTenantId + ":" + objectId
);
var clientCredential = new ClientCredential(this.authOptions.ClientId, this.authOptions.ClientSecret);
var authenticationContext = new AuthenticationContext(this.authOptions.AADInstance + this.authOptions.TenantId, distributedTokenCache);
AuthenticationResult authenticationResult;
var accessToken = await GetTokenWithFallBackAsync(this.httpContextAccessor.HttpContext, "access_token");
if (accessToken != null)
{
if (this.httpContextAccessor?.HttpContext?.Items?["isAuthenticatedService"] as bool? == true)
{
authenticationResult = await authenticationContext.AcquireTokenAsync(resource, this.backgroundServiceClientCredential).ConfigureAwait(false);
}
else
{
var userPrincipalName = this.httpContextAccessor.HttpContext.User.Identity.Name;
var userAssertion = new UserAssertion(accessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userPrincipalName);
authenticationResult = await authenticationContext.AcquireTokenAsync(resource, clientCredential, userAssertion).ConfigureAwait(false);
}
}
else
{
// Just hope we already have a token (openid case)
var userIdentifier = new UserIdentifier(objectId, UserIdentifierType.UniqueId);
authenticationResult = await authenticationContext.AcquireTokenSilentAsync(resource, clientCredential, userIdentifier);
}
return authenticationResult.CreateAuthorizationHeader();
}
Теперь я хочу использовать msal nuget, т.е. Microsoft.Identity.Client, поэтому хочу преобразовать приведенный выше код, который может работать для нового nuget.