Получение токена, но не области внутри этого токена, с использованием кода 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.

0 ответов

Другие вопросы по тегам