配置 .NET 8 Blazor SSR(静态)应用程序以与 Azure AD B2C 中的 Entra ID 配合使用

问题描述 投票:0回答:1

我在配置 .NET 8 Blazor SSR 静态应用程序以在 Azure AD B2C 中使用 Entra ID 时遇到问题。

在 Program.cs 中我有这个:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAdB2C"));

我的配置如下所示:

  "AzureAdB2C": {
    "Instance": "https://[example].b2clogin.com",
    "Domain": "[example].onmicrosoft.com",
    "TenantId": "[my tenant id]",
    "ClientId": "[my client id]",
    "ClientCapabilities": [ "cp1" ],
    "SignUpSignInPolicyId": "B2C_1_signup-signin",
    //"ResponseType": "code"  <== commented out
  }

在 Azure 上,我注册应用程序:

Platform: Web

Redirect URI: https://localhost:7021/signin-oidc

Access Tokens and Id Tokens both NOT selected.

使用上述配置,当我导航到该站点时出现以下错误:

AADB2C90057:所提供的应用程序未配置为允许“OAuth”隐式流程。

如果我同时选择访问令牌和 Id 令牌,我会收到相同的错误。

如果我在配置中包含

"ResponseType": "code"
,那么我将看到登录屏幕。我可以登录,但出现以下错误:

AADB2C90079:客户在兑换机密赠款时必须发送 client_secret。

无论是否选择访问令牌和 Id 令牌,都会发生这种情况。

如果我在门户中添加客户端密钥并将其添加到配置中,则会收到以下错误:

IDX21336:“id_token”和“access_token”都应该出现在从令牌端点接收到的 OpenIdConnectProtocolValidationContext.ProtocolMessage 中。无法处理消息。

无论是否选择访问令牌和 Id 令牌,都会发生这种情况。

Entra ID 集成助手还报告:

如果我禁用访问令牌,则满足第二个警告。

无奈之下,我什至尝试将平台设置为SPA,但这又带来了另一轮错误。

研究这个问题具有挑战性,部分原因是 .NET 8 Blazor SSR(静态)相对较新,而且 Blazor 具有三种风格(WASM、服务器和现在的静态)。

我在这里寻求一些指导。我认为这与在 SPA 中实现 Auth 相比会更容易,但我错了。希望我忽略了显而易见的事情。我想要“正确”的配置,不仅可以工作,而且是最安全的。

asp.net-core blazor azure-ad-b2c blazor-server-side microsoft-entra-id
1个回答
0
投票

我终于成功了(我想)。以下是有效的设置:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAdB2C"));

// 我通过添加以下内容解决了另一个错误: builder.Services.AddScoped();

配置:

  "AzureAdB2C": {
    "Instance": "https://[example].b2clogin.com",
    "Domain": "[example].onmicrosoft.com",
    "TenantId": "[my tenant id]",
    "ClientId": "[my client id]",
    "ClientSecret": "[some client secret value]"
    "ClientCapabilities": [ "cp1" ],
    "SignUpSignInPolicyId": "B2C_1_signup-signin",
    "ResponseType": "code",
    "UsePkce": true,
    "Scope": [ "openid", "{clientId}" ]
  }

上述配置有效,但需要集成助手不喜欢的客户端密钥。对客户端密钥的需求表明 PKCE 不起作用或不受支持。有了这个,我删除了客户端密钥,从配置中删除了 ClientSecret,并删除了 Web 平台配置。我添加了 SPA 平台配置,它起作用了(几分钟后),并且删除了客户端密钥后,集成助手很高兴。

所以看来 SPA 支持 PKCE,但 Web 不支持。当然,Blazor Server SSR 是一个 Web 应用程序,而不是 SPA,但这是我让它工作的唯一方法。

另请注意,最终设置中未选择访问令牌和 Id 令牌。

虽然我已经做到了这一点,但我仍将这个问题悬而未决。如果一些专家插话,那将非常有用。它正在起作用,但我不确定它是否“正确”。

© www.soinside.com 2019 - 2024. All rights reserved.