如何将“AzureAd”详细信息显式传递给 AddMicrosoftIdentityWebApi 方法以进行令牌验证

Posted

技术标签:

【中文标题】如何将“AzureAd”详细信息显式传递给 AddMicrosoftIdentityWebApi 方法以进行令牌验证【英文标题】:How to explicitly pass the"AzureAd" details to AddMicrosoftIdentityWebApi method for token validation 【发布时间】:2021-03-29 01:54:03 【问题描述】:

我正在使用 Microsoft.Identity.Web 库来验证我的 .Net Core Web API 中的令牌。

        public void ConfigureServices(IServiceCollection services)
        
             ------------

           services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                       .AddMicrosoftIdentityWebApi(Configuration);

             ------------
        

但根据文档here,我需要通过 IConfiguration 实例将 AzureAd(将包含tenantId、ClientId、域、实例等的对象)对象传递给AddMicrosoftIdentityWebApi 方法.截至目前,此方法尝试从本地 appsettings.json 文件加载此对象。我想将这些详细信息显式传递给方法AddMicrosoftIdentityWebApi,因为我们没有在本地 appsettings.json 文件中存储任何键值(所有都来自 Consul 和 Vault)。

我试图覆盖配置对象但无法做到。

如何将此 AzureAd 对象传递给 AddMicrosoftIdentityWebApi 方法,以便它可以为我验证令牌? 由于我是这个图书馆的新手,我在这里错过了什么吗?可能是错误的验证方法?

提前谢谢....

更新: 嘿.. 我设法明确地传递了这些值。

Action<JwtBearerOptions> configureJwtBearerOptions = Test1;
                static void Test1(JwtBearerOptions t1)
                
                    t1.Audience = $"appSettings.adCredentials.Instance/appSettings.adCredentials.TenantId";
                    t1.TokenValidationParameters.ValidAudiences = new string[]  appSettings.adCredentials.ClientId, $"api://appSettings.adCredentials.ClientId" ;
                

                Action<MicrosoftIdentityOptions> configureMicrosoftIdentityOptions = Test2;
                static void Test2(MicrosoftIdentityOptions t2)
                
                    t2.TenantId = appSettings.adCredentials.TenantId;
                    t2.ClientId = appSettings.adCredentials.ClientId;
                    t2.Instance = appSettings.adCredentials.Instance;
                    t2.Domain = appSettings.adCredentials.Domain;
                    t2.ClientSecret = appSettings.adCredentials.ClientSecret;
                

                IdentityModelEventSource.ShowPII = true;
                services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                       .AddMicrosoftIdentityWebApi(configureJwtBearerOptions, configureMicrosoftIdentityOptions) ;

现在当我从邮递员调用 API 时,它会抛出错误以及状态码 500:

System.InvalidOperationException: IDX20803: Unable to obtain configuration from: 'https://graph.microsoft.com/tenantId/v2.0/.well-known/openid-configuration'.
 ---> System.IO.IOException: IDX20807: Unable to retrieve document from: 'https://graph.microsoft.com/tenantId/v2.0/.well-known/openid-configuration'. HttpResponseMessage: 'StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent

你能解释一下这个问题以及如何解决这个问题吗?

【问题讨论】:

我认为它有一个你可以使用的重载,它允许你指定一个接受选项的函数。这使您可以根据需要在其中设置值。 您能否举例回答,因为我完全是新手 @samirjamadar 您需要将 tenantId 替换为您的 directoryId 【参考方案1】:

Configuration 之后用"AzureAd" 重载您的AddMicrosoftIdentityWebApi

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApi(Configuration, "AzureAd");

【讨论】:

他在问如果没有可用的 IConfiguration 怎么做。我有同样的问题,我们使用自己的配置格式,需要明确地传递这些值。【参考方案2】:

.net 6

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

【讨论】:

以上是关于如何将“AzureAd”详细信息显式传递给 AddMicrosoftIdentityWebApi 方法以进行令牌验证的主要内容,如果未能解决你的问题,请参考以下文章

如何将订单详细信息传递给 PayPal 智能按钮结账

如何将身份验证详细信息传递给 iframe 内的应用程序?

如何使用 GET 或 POST 方法将对象详细信息传递给 index.html 并在 HTML <pre> 标记中显示

如何将AWS实例的详细信息传递给jenkins作业,以便该作业在实例中ssh和执行

将详细信息传递给模态时 id 未定义

如何在反应JavaScript中将id传递给navlink