You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:47:43