Blazor WASM AzureAD IdentityServer 导致 AADSTS90023:公共客户端无法发送客户端密码

Posted

技术标签:

【中文标题】Blazor WASM AzureAD IdentityServer 导致 AADSTS90023:公共客户端无法发送客户端密码【英文标题】:Blazor WASM AzureAD IdentityServer results in AADSTS90023: Public clients can't send a client secret 【发布时间】:2022-01-15 02:06:15 【问题描述】:

我正在尝试在 Blazor WASM(Asp.Net 托管解决方案)中获取 IdentityServer 6 以使用 Microsoft id,但遇到错误消息“AADSTS90023:公共客户端无法发送客户端密码” .我觉得我已经尝试了所有我能想到的配置,但希望我仍然错过了一些东西。

IdentityServer 配置使用我认为适合我的场景的“SPA”配置文件:

"IdentityServer": 
"Clients": 
  "Blazor.Client": 
    "ClientId": "Blazor.Client",
    "ClientName": "Blazor.Client",
    "Profile": "SPA",
    "RedirectUri": "https://localhost:15601",
    "LogoutUri": "https://localhost:15601"
  

配置代码遵循最简单的例子:

.AddMicrosoftAccount(options =>
            
                options.ClientId = <clientId>;
                options.ClientSecret = <secret>
            )

因为这些代码 sn-ps 基本上是执行此操作的最简单方法,所以我假设我的 AzureAD 应用程序注册有问题,但我不知道是什么问题。我已包含清单:


"id": "<id>",
"acceptMappedClaims": null,
"accessTokenAcceptedVersion": 2,
"addIns": [],
"allowPublicClient": false,
"appId": "<apiId>",
"appRoles": [],
"oauth2AllowUrlPathMatching": false,
"createdDateTime": "2021-12-10T09:21:08Z",
"certification": null,
"disabledByMicrosoftStatus": null,
"groupMembershipClaims": null,
"identifierUris": [
    "api://<apiId>"
],
"informationalUrls": 
    "termsOfService": null,
    "support": null,
    "privacy": null,
    "marketing": null
,
"keyCredentials": [],
"knownClientApplications": [],
"logoUrl": null,
"logoutUrl": null,
"name": "<name>",
"oauth2AllowIdTokenImplicitFlow": false,
"oauth2AllowImplicitFlow": false,
"oauth2Permissions": [],
"oauth2RequirePostResponse": false,
"optionalClaims": null,
"orgRestrictions": [],
"parentalControlSettings": 
    "countriesBlockedForMinors": [],
    "legalAgeGroupRule": "Allow"
,
"passwordCredentials": [
    
        "customKeyIdentifier": null,
        "endDate": "2023-12-10T09:21:45.315Z",
        "keyId": "<keyId>",
        "startDate": "2021-12-10T09:21:45.315Z",
        "value": null,
        "createdOn": "2021-12-10T09:21:57.2927675Z",
        "hint": "H1f",
        "displayName": "<displayName>"
    
],
"preAuthorizedApplications": [],
"publisherDomain": "<publisherDomain>.onmicrosoft.com",
"replyUrlsWithType": [
    
        "url": "https://localhost:15602/signin-microsoft",
        "type": "Spa"
    
],
"requiredResourceAccess": [
    
        "resourceAppId": "00000003-0000-0000-c000-000000000000",
        "resourceAccess": [
            
                "id": "<someId>",
                "type": "Scope"
            
        ]
    
],
"samlMetadataUrl": null,
"signInUrl": null,
"signInAudience": "AzureADandPersonalMicrosoftAccount",
"tags": [],
"tokenEncryptionKeyId": null

不支持这种情况还是我做错了什么?

编辑:最终问题出在重定向 uri 平台上,该平台不应设置为“SPA”而是“Web”,因为它不是客户端进行身份验证,而是 IdentityServer Web 服务。相关部分是:

    "replyUrlsWithType": [
    
        "url": "https://localhost:15602/signin-microsoft",
        "type": "Web"
    

【问题讨论】:

如果我的回答对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记,将其从灰色切换为已填充。)。这对其他社区成员可能是有益的。谢谢 【参考方案1】:
    该 客户秘密实际上必须保密,即;你不能把它放在网站上 并从公共前端使用它。客户端凭据流程设计也是如此。 Blazor webassembly 应用程序称为“公共 oAuth/openid 术语中的应用程序。

注意:根据微软文档:

公共客户端(原生应用和单页应用)不得使用 兑换授权码时的秘密或证书 - 总是 确保您的重定向 URI 正确指示 应用

因此,请尝试在 IdP 上禁用对客户端密码的要求并刷新令牌,因为它们也无法以安全/安全的方式进行处理。

建议公共客户端使用code+PKCE, 当您将 response_type 设置为 code 时,这会自动发生。

参考:Microsoft identity platform and OAuth 2.0 authorization code flow - Microsoft identity platform | Microsoft Docs

【讨论】:

感谢您的回复 - 它让我朝着正确的方向前进。我犹豫将其标记为答案,因为最终解决方案有点不同。事实上,我并没有从客户端发送秘密——这就是错误消息让我感到困惑的原因。客户端联系服务器端包含秘密的 IdentityServer api。但是,要使其正常工作,回复 url 必须是“Web”类型,而不是“SPA”类型(因为就像您提到的那样,这不适用于秘密)。我替换了 redirectUri 并且有效。再次感谢您的回复!

以上是关于Blazor WASM AzureAD IdentityServer 导致 AADSTS90023:公共客户端无法发送客户端密码的主要内容,如果未能解决你的问题,请参考以下文章

具有 ReportViewer 导出功能的 Blazor (Wasm)

Blazor 客户端 (WASM) 应用程序洞察

Blazor_WASM之3:项目结构

blazor wasm开发chrome插件

Blazor Wasm 身份登录/注销事件

Blazor WASM - 流畅的验证