.NET应用如何登录微软账户调用Dynamics CRM AAD用户API?
解决Dynamics 365 Dataverse API的.NET认证问题
Dynamics 365 Dataverse API不支持基本认证或NetworkCredential这类传统认证方式,必须使用OAuth 2.0令牌完成身份验证,这就是你之前的代码返回401的原因。以下是两种适合.NET应用的认证实现方案:
方案1:后台服务无用户交互(客户端凭据流)
适合不需要用户登录的后台服务,通过Azure AD应用的身份直接获取权限:
前置准备
- 在Azure AD中注册应用程序,记录客户端ID、租户ID、客户端密钥
- 给该应用添加Dataverse的应用权限(
Dynamics CRM > Access Dynamics 365 as organization users)并完成管理员授权
代码实现
using Microsoft.Identity.Client; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; class DynamicsApiClient { static async Task Main(string[] args) { // 替换为你的实际配置 var clientId = "YOUR_CLIENT_ID"; var tenantId = "YOUR_TENANT_ID"; var clientSecret = "YOUR_CLIENT_SECRET"; var apiUrl = "https://[org uri].crm.dynamics.com/api/data/v9.1/aadusers"; var scope = $"https://[org uri].crm.dynamics.com/.default"; // 初始化MSAL客户端 var app = ConfidentialClientApplicationBuilder .Create(clientId) .WithClientSecret(clientSecret) .WithTenantId(tenantId) .Build(); // 获取访问令牌 var tokenResult = await app.AcquireTokenForClient(new[] { scope }).ExecuteAsync(); // 发起API请求 using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.AccessToken); httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0"); httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0"); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await httpClient.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); // 若请求失败抛出异常 var responseContent = await response.Content.ReadAsStringAsync(); // 此处可解析JSON数据,比如使用Newtonsoft.Json或System.Text.Json System.Console.WriteLine(responseContent); } }
方案2:需要用户登录(授权码流)
适合桌面/客户端应用,需要用户通过微软账户登录授权:
前置准备
- 在Azure AD中注册应用程序,记录客户端ID、租户ID
- 给该应用添加Dataverse的委派权限(
Dynamics CRM > user_impersonation) - 设置重定向URI为
http://localhost(桌面应用默认值)
代码实现
using Microsoft.Identity.Client; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; class DynamicsApiClient { static async Task Main(string[] args) { // 替换为你的实际配置 var clientId = "YOUR_CLIENT_ID"; var tenantId = "YOUR_TENANT_ID"; var apiUrl = "https://[org uri].crm.dynamics.com/api/data/v9.1/aadusers"; var scope = $"https://[org uri].crm.dynamics.com/user_impersonation"; // 初始化MSAL客户端 var app = PublicClientApplicationBuilder .Create(clientId) .WithTenantId(tenantId) .WithRedirectUri("http://localhost") .Build(); // 弹出登录窗口获取令牌 var tokenResult = await app.AcquireTokenInteractive(new[] { scope }).ExecuteAsync(); // 发起API请求(同方案1的请求部分) using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenResult.AccessToken); httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0"); httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0"); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await httpClient.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); System.Console.WriteLine(responseContent); } }
必要依赖
安装MSAL核心NuGet包:
Install-Package Microsoft.Identity.Client
注意事项
- 不要硬编码客户端密钥等敏感信息,生产环境建议用Azure Key Vault存储
- 确保应用权限已完成管理员授权(应用权限需要,委派权限若为租户范围也需要)
- 替换代码中所有占位符为你的实际配置值
内容的提问来源于stack exchange,提问作者Fred Myspamm
相关产品推荐
相关产品推荐

