Как использовать AddMicrosoftIdentityWebApiAuthentication без раздела appsettings?

#azure #azure-active-directory #microsoft-identity-platform #microsoft-identity-web

#azure #azure-active-directory #microsoft-identity-platform #microsoft-identity-web

Вопрос:

Я внедряю Azure Active Directory в API .NET 5. В настоящее время этот API отлично работает на .NET Core 2.2.

Это старый рабочий код:

 services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
    .AddAzureADBearer(options =>
    {
         options.Instance = "https://login.microsoftonline.com/";
         options.Domain = backOfficeADDomain;
         options.TenantId = backOfficeADTenantId;
         options.ClientId = $"api://{backOfficeADAPIClientId}";
         options.ClientSecret = backOfficeADAPISecret;
    });
 

Но с момента обновления до .NET 5 я получаю это предупреждение:

‘AzureADAuthenticationBuilderExtensions.AddAzureADBearer(AuthenticationBuilder, Action)’ устарел: ‘Это устарело и будет удалено в будущей версии. Используйте AddMicrosoftWebApiAuthentication от Microsoft.Идентификация.Вместо этого веб. См. https://aka.ms/ms-identity-web .’

Итак, я попытался обновить его до этого:

 services.AddMicrosoftIdentityWebApiAuthentication(_configuration, "AzureAd");
 

Кажется, что раздел «AzureAD» в appsettings.json — единственный способ передать учетные данные. Как я могу вручную ввести экземпляр, домен, идентификатор клиента и т. Д.? Я не использую appsettings.json, все данные извлекаются вручную из AzureKeyVault.

Спасибо!

Ответ №1:

Предполагая, что у вас есть веская причина не использовать значение конфигурации из ваших настроек, вы можете добавить поставщика inmemory.

Вы также можете создать конфигурацию, которая используется только для этого метода расширения :

 var azureAdConfig = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string>
    {
        {"AzureAd:Instance", "https://login.microsoftonline.com/"},
        {"AzureAd:Domain", backOfficeADDomain}
        //...
    })
    .Build();

services.AddMicrosoftIdentityWebApiAuthentication(azureAdConfig);
 

Ответ №2:

Хорошо, я нашел это!

На самом деле это очень просто:

 IConfigurationSection azureAdSection = _configuration.GetSection("AzureAd");

azureAdSection.GetSection("Instance").Value = "https://login.microsoftonline.com/";
azureAdSection.GetSection("Domain").Value = backOfficeADDomain;
azureAdSection.GetSection("TenantId").Value = backOfficeADTenantId;
azureAdSection.GetSection("ClientId").Value = backOfficeADAPIClientId;
azureAdSection.GetSection("ClientSecret").Value = backOfficeADAPISecret;

services.AddMicrosoftIdentityWebApiAuthentication(_configuration, "AzureAd");
 

Кажется, что после целого дня сложного рефакторинга кода мой мозг не смог понять такое простое решение.

Обратите внимание, что мне также пришлось удалить «api://» из идентификатора клиента. Похоже, что новая версия добавляет его автоматически. Он попытался проверить «api: // api: //».