Azure B2C刷新令牌:不同创建方式用户的client_secret要求差异问题
解决Azure B2C刷新令牌时的
AADB2C90084错误 嘿,这个问题的核心矛盾其实是应用程序的客户端类型配置差异导致的——AzureAD模块创建用户时,默认把关联的应用标记成了「公共客户端」,而你通过门户/Postman操作时用的是「机密客户端」,两者的令牌刷新规则完全不同。
为什么会出现这个错误?
- 机密客户端(Confidential Client):这类应用(比如Web应用)能安全存储
client_secret,所以刷新令牌时必须携带这个密钥来证明身份,这就是门户/Postman场景下正常的原因。 - 公共客户端(Public Client):像移动APP、桌面APP这类无法安全保存密钥的应用,AzureAD会把它们归为公共客户端,这类客户端刷新令牌时绝对不能发送
client_secret,否则就会触发AADB2C90084错误。而AzureAD模块创建用户时,大概率默认关联了公共客户端类型的应用。
三种解决方案任你选
1. 把应用改成机密客户端(最直接)
如果你的应用本来就应该是机密客户端(比如Web应用),直接在Azure门户调整配置:
- 登录Azure B2C租户,进入应用注册找到你的应用
- 点击概述页面的「客户端类型」编辑按钮
- 把类型从「公共客户端」切换为「机密客户端」,保存更改
- 之后刷新令牌时继续携带
client_secret就没问题了
2. 适配公共客户端的刷新流程
如果你的应用确实是公共客户端(比如桌面APP),那刷新令牌时要去掉client_secret参数,用公共客户端的请求格式:
# 示例:公共客户端刷新令牌的PowerShell请求 $tokenUrl = "https://your-b2c-tenant.b2clogin.com/your-b2c-tenant.onmicrosoft.com/B2C_1_your-signup-signin-policy/oauth2/v2.0/token" $refreshParams = @{ grant_type = "refresh_token" refresh_token = "your-valid-refresh-token" client_id = "your-app-client-id" scope = "openid offline_access your-api-scope" } $newToken = Invoke-RestMethod -Uri $tokenUrl -Method Post -Body $refreshParams
3. 调整PowerShell创建用户的关联应用
检查你用New-AzureADUser时关联的应用,确保它是已配置为机密客户端的应用:
# 先获取目标机密客户端的应用对象 $targetApp = Get-AzureADApplication -Filter "DisplayName eq 'Your-Confidential-App'" # 创建用户时显式关联该应用 $passwordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile $passwordProfile.Password = "YourStrongPassword123!" $passwordProfile.ForceChangePasswordNextLogin = $false New-AzureADUser -AccountEnabled $true ` -DisplayName "Test User" ` -UserPrincipalName "test-user@your-b2c-tenant.onmicrosoft.com" ` -PasswordProfile $passwordProfile ` -AppId $targetApp.AppId
快速验证应用类型的方法
进入应用注册的认证页面:如果看到「允许公共客户端流」的开关是开启状态,那就是公共客户端;如果有「客户端凭据」下的密钥配置,那就是机密客户端。
内容的提问来源于stack exchange,提问作者Germán Svriz
相关产品推荐
相关产品推荐

