使用C#连接Dataverse API时遇AADSTS7000218错误求助
解决AADSTS7000218错误:请求体必须包含'client_assertion'或'client_secret'
问题原因
你的连接字符串同时混合了用户名密码凭据和应用注册AppId,导致Azure AD无法确定要使用的认证流:
- 若使用用户名密码(ROPC流),无需指定
AppId,AAD会默认使用内置的公共客户端ID; - 若指定
AppId,AAD会认为你要使用客户端凭据流或需要验证应用身份,因此要求提供client_secret或client_assertion。
解决方案
根据你的需求选择以下一种方式修正连接字符串:
方式1:使用纯用户名密码认证(移除AppId)
如果要通过指定的用户名密码直接登录,删除连接字符串中的AppId参数即可:
static string connectionString = $@" AuthType = OAuth; Url = {url}; UserName = {userName}; Password = {password}; RedirectUri = http://localhost; LoginPrompt=Auto; RequireNewInstance = True";
方式2:使用应用注册的设备码流(移除用户名密码,启用公共客户端流)
如果要通过浏览器登录(更安全,避免硬编码密码),按以下步骤操作:
- 在Azure AD应用注册的身份验证页面,找到高级设置,将允许公共客户端流设置为是;
- 修改连接字符串,移除
UserName和Password参数,保留AppId:
static string connectionString = $@" AuthType = OAuth; Url = {url}; AppId = {appId}; RedirectUri = http://localhost; LoginPrompt=Auto; RequireNewInstance = True";
运行代码后,控制台会输出一个链接和验证码,打开链接输入验证码即可完成登录。
方式3:使用机密客户端流(添加ClientSecret)
如果你的应用是服务器端应用(非控制台/桌面这类公共客户端),可以在应用注册中生成客户端密钥,然后在连接字符串中添加ClientSecret参数:
static string connectionString = $@" AuthType = OAuth; Url = {url}; AppId = {appId}; ClientSecret = {clientSecret}; RedirectUri = http://localhost; LoginPrompt=Auto; RequireNewInstance = True";
注意:此方式需要应用注册配置应用权限(而非委派权限),并完成管理员同意。
内容的提问来源于stack exchange,提问作者Hawkeye312
相关产品推荐
相关产品推荐

