azure 如何在没有应用程序设置的情况下使用AddMicrosoftIdentityWebApiAuthentication部分?

ht4b089n  于 2022-11-17  发布在  其他
关注(0)|答案(3)|浏览(144)

我正在.NET 5 API中实现Azure Active Directory。我目前在.NET Core 2.2上完美运行此API。
这是旧的工作代码:

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后,我收到了以下警告:
'AzureADAuthenticationBuilder延伸模块.AddAzureADBearer(AuthenticationBuilder,动作)'已过时:'此验证已过时,将在未来版本中删除。请改用Microsoft.Identity.Web中的AddMicrosoftWebApiAuthentication。请参阅https://aka.ms/ms-identity-web。'
所以我试着把它更新成这样:

services.AddMicrosoftIdentityWebApiAuthentication(_configuration, "AzureAd");

似乎appsettings.json中的“AzureAd”部分是传递凭据的唯一方法。我如何手动输入示例、域、ClientId等?我不使用appsettings.json,所有数据都是从AzureKeyVault手动检索的。
谢谢你,谢谢你

sc4hvdpw

sc4hvdpw1#

假设您有充分的理由不使用设定中的组态值,您可以加入inmemory提供者。
您还可以创建仅用于此扩展方法的配置:

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

services.AddMicrosoftIdentityWebApiAuthentication(azureAdConfig);
46scxncf

46scxncf2#

好了,我找到了!
其实很简单:

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");

看来,经过一整天的复杂代码重构,我的大脑无法理解这样一个简单的解决方案。
请注意,我还必须从clientId中删除“api://”。看起来新版本会自动添加它。它试图验证“api://api://"。

y53ybaqx

y53ybaqx3#

这是一个老问题,但也许值得在这里增加几分钱。首先,使用Azure KeyVault存储配置值并不妨碍您使用IConfiguration抽象来获取这些值。您所需要的只是Azure.Extensions.AspNetCore.Configuration.Secrets nuget包,然后使用builder.Configuration.AddAzureKeyVault方法注册新的配置源。通常,这就是IConfigurationIConfigurationSource抽象的用途。保持应用程序逻辑干净,不阅读配置值,而不管其来源。
第二种方法也有更简单的方法。你可以简单地利用下面使用的选项模式。因此你可以注册你自己的IPostConfigureOptions<JwtBearerOptions>实现。例如:

public class AuthenticationOptionsConfiguration : IPostConfigureOptions<JwtBearerOptions>
    {
        private readonly YourDependency _dependency;
    
        public AuthenticationOptionsConfiguration(YourDependency dependency)
        {
            _dependency = dependency;
        }
    
        public void PostConfigure(string name, JwtBearerOptions options)
        {
            options.Instance = "https://login.microsoftonline.com/";
            options.Domain = _dependency.BackOfficeADDomain;
            (...)
        }
    }

并将其注册到builder.Services.ConfigureOptions<AuthenticationOptionsConfiguration>();。这样,您还可以访问options.Events属性,并在需要时添加一些处理程序。

相关问题