如何添加 JwtBearer 和 AddMicrosoftIdentityWebAppAuthentication
How to Add JwtBearer along with AddMicrosoftIdentityWebAppAuthentication
我不确定我是否完全理解 Microsoft.Identity.Web 的变化,但我正在关注一篇文章(given by Microsoft here) 它描述了如何在启动时进行更改
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
到
services.AddMicrosoftIdentityWebAppAuthentication(Configuration);
虽然这看起来不错而且简单,但我还有一些工作要做,因为我现有的代码中有以下代码片段
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => this.configuration.Bind("AzureAd", options))
.AddJwtBearer(options =>
{
//this code used to validate signing keys
string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdConfig = configurationManager.GetConfigurationAsync(CancellationToken.None).GetAwaiter().GetResult();
var tenantId = this.configuration["TenantId"];
var validIssuer = $"https://sts.windows.net/{tenantId}/";
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = validIssuer,
ValidAudience = this.configuration["ClientId"],
IssuerSigningKeys = openIdConfig.SigningKeys,
};
});
为了给您一点背景信息,我们有两个版本的此应用程序
- 用户登录并做一些工作人员(这里用户将获得 Microsoft 登录对话框以使用 his/her 凭据登录)
- Microsoft Azure 使用一些令牌调用我们的端点,我们需要验证该令牌。
您在上面看到的 JWTvaliation 部分是针对第二项的,一旦我们收到令牌,我们就会在没有登录和 UI 工作流程的情况下验证该令牌。
问题:
上面的代码工作正常。这里唯一的问题是如果我们喜欢使用 Microsoft.Identity
我们应该如何使用第二项 (JWT) 因为 services.AddAuthentication().AddAzureAD
returns IAuthenticationBuilder
我们进一步使用它来添加 AddJwtBearer
, 而 services.AddMicrosoftIdentityWebAppAuthentication
不 return IAuthenticationBuilder
.
AddMicrosoftIdentityWebAppAuthentication
实际上是just a fancy way做以下事情:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(…)
因此它将默认方案配置为 OIDC 方案并运行 AddMicrosoftIdentityWebApp
以配置最终执行的操作。
现在,AddAuthentication
实际上可以在服务集合上多次调用。您只需要注意不要错误地重新配置即可。无参数函数不会这样做,因此访问 IAuthenticationBuilder
以进一步配置身份验证是一个很好的方法。
这意味着您可以像这样更改代码:
// configure Microsoft Identity Web first
// this also sets the default authentication to OIDC
services.AddMicrosoftIdentityWebAppAuthentication(Configuration);
// retrieve an authentication builder without changing the default
services.AddAuthentication()
// add JWT bearer now
.AddJwtBearer(options =>
{
// …
});
我不确定我是否完全理解 Microsoft.Identity.Web 的变化,但我正在关注一篇文章(given by Microsoft here) 它描述了如何在启动时进行更改
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
到
services.AddMicrosoftIdentityWebAppAuthentication(Configuration);
虽然这看起来不错而且简单,但我还有一些工作要做,因为我现有的代码中有以下代码片段
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => this.configuration.Bind("AzureAd", options))
.AddJwtBearer(options =>
{
//this code used to validate signing keys
string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdConfig = configurationManager.GetConfigurationAsync(CancellationToken.None).GetAwaiter().GetResult();
var tenantId = this.configuration["TenantId"];
var validIssuer = $"https://sts.windows.net/{tenantId}/";
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = validIssuer,
ValidAudience = this.configuration["ClientId"],
IssuerSigningKeys = openIdConfig.SigningKeys,
};
});
为了给您一点背景信息,我们有两个版本的此应用程序
- 用户登录并做一些工作人员(这里用户将获得 Microsoft 登录对话框以使用 his/her 凭据登录)
- Microsoft Azure 使用一些令牌调用我们的端点,我们需要验证该令牌。
您在上面看到的 JWTvaliation 部分是针对第二项的,一旦我们收到令牌,我们就会在没有登录和 UI 工作流程的情况下验证该令牌。
问题:
上面的代码工作正常。这里唯一的问题是如果我们喜欢使用 Microsoft.Identity
我们应该如何使用第二项 (JWT) 因为 services.AddAuthentication().AddAzureAD
returns IAuthenticationBuilder
我们进一步使用它来添加 AddJwtBearer
, 而 services.AddMicrosoftIdentityWebAppAuthentication
不 return IAuthenticationBuilder
.
AddMicrosoftIdentityWebAppAuthentication
实际上是just a fancy way做以下事情:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(…)
因此它将默认方案配置为 OIDC 方案并运行 AddMicrosoftIdentityWebApp
以配置最终执行的操作。
现在,AddAuthentication
实际上可以在服务集合上多次调用。您只需要注意不要错误地重新配置即可。无参数函数不会这样做,因此访问 IAuthenticationBuilder
以进一步配置身份验证是一个很好的方法。
这意味着您可以像这样更改代码:
// configure Microsoft Identity Web first
// this also sets the default authentication to OIDC
services.AddMicrosoftIdentityWebAppAuthentication(Configuration);
// retrieve an authentication builder without changing the default
services.AddAuthentication()
// add JWT bearer now
.AddJwtBearer(options =>
{
// …
});