我在配置 .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 相比会更容易,但我错了。希望我忽略了显而易见的事情。我想要“正确”的配置,不仅可以工作,而且是最安全的。
我终于成功了(我想)。以下是有效的设置:
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 令牌。
虽然我已经做到了这一点,但我仍将这个问题悬而未决。如果一些专家插话,那将非常有用。它正在起作用,但我不确定它是否“正确”。