使用 OAuth 连接到 Microsoft Dynamics 365 Web 服务

 

发布日期: 2017年1月

适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online

OAuth 是 Microsoft Dynamics 365 Web API 支持的身份验证方法,是组织服务的两种身份验证方法之一 - 另外一种方法是 Active Directory 身份验证。 使用 OAuth 的一个好处是您的应用程序可以支持多重身份验证。 当您的应用程序了解到组织服务或发现服务时,您可以使用 OAuth 身份验证。

调用 Web 服务方法必须使用该服务终结点的身份提供程序进行授权。 消息请求的标头中提供由 Microsoft Azure Active Directory 签发的有效的 OAuth 2.0(用户)访问令牌时,授权获得批准。

与 Dynamics 365 Web API 一起使用的身份验证 API 推荐使用Azure Active Directory 身份验证库 (ADAL),它可用于各种平台和编程语言。 API ADAL 管理使用 Dynamics 365 Web 服务身份提供程序进行的 OAuth 2.0 身份验证。 有关实际使用的 OAuth 协议的更多详细信息,请参阅使用 OAuth 进行 CRM 服务验证

您使用 OAuth 身份验证连接 Dynamics 365 Web 服务前,您的应用程序必须先在 Microsoft Azure Active Directory 上注册。Azure Active Directory 用于验证您的应用程序对存储在 Dynamics 365 租户中的业务数据的访问权限。

使用 ADAL 进行身份验证

使用 ADAL 进行基本的 OAuth Web 服务身份验证仅通过几行代码完成。

// TODO Substitute your correct CRM root service address, 
string resource = "https://mydomain.crm.dynamics.com";

// TODO Substitute your app registration values that can be obtained after you
// register the app in Active Directory on the Microsoft Azure portal.
string clientId = "e5cf0024-a66a-4f16-85ce-99ba97a24bb2";
string redirectUrl = "https://localhost/SdkSample";


// Authenticate the registered application with Azure Active Directory.
AuthenticationContext authContext = 
    new AuthenticationContext("https://login.windows.net/common", false);
AuthenticationResult result = authContext.AcquireToken(resource, clientId, new
                                                       Uri(redirectUrl));

使用众所周知的权限提供程序返回身份验证上下文。 如果您不知道与您调用的 Dynamics 365 实例关联的 Azure Active Directory 租户,您可以使用“https://login.windows.net/common”的恒定字符串,这是用于多个租户场景的权限 URL。 本主题后面介绍在运行时间动态发现权限的备用方法。

下一行代码获取身份验证结果,包含您需要的访问令牌。 您可以使用此令牌向 Web 服务发送消息请求。

此代码中还有一些值得关注的项目是使用的字符串值。 资源变量包含您的 Dynamics 365 服务器的 传输层安全 (TLS) 或安全套接字层 (SSL) 根地址,包括域(组织)。clientIdredirectUrl 变量包含在 Active Directory 上注册应用程序产生的应用程序注册信息。 有关应用程序注册的详细信息,请参阅 演练:使用 Azure Active Directory 注册 Dynamics 365 应用程序

使用消息请求中的访问令牌

根据您使用的 Dynamics 365 API,有两种不同的方法向 Web 服务发送消息请求。 对于 Web API,通常会发送 HTTP 消息请求。 对于组织服务,可以使用 Web 客户端代理发送消息请求。

HTTP 消息请求

一旦您获取访问令牌,您必须将您要发送给 Web 服务的消息请求的授权标头设置为访问令牌值,并指定“Bearer”的令牌类型。 有关授权标头的更多信息,请参阅 HTTP/1.1 协议第 14.8 节。 以下代码演示如何使用 System.Net.Http.HttpClient 类执行此操作。

using (HttpClient httpClient = new HttpClient())
{
    httpClient.Timeout = new TimeSpan(0, 2, 0);  // 2 minutes
    httpClient.DefaultRequestHeaders.Authorization = 
        new AuthenticationHeaderValue("Bearer", result.AccessToken);

Web 客户端请求

使用组织服务的OrganizationWebProxyClientDiscoveryWebProxyClient时,只需将HeaderToken属性值设置为访问令牌。

刷新访问令牌

建议最佳做法是每次调用 Dynamics 365 Web 服务方法前刷新访问令牌。 这是编写代码检查访问令牌的到期日期和时间并在访问令牌即将到期时进行刷新的一种解决方法。

若要刷新 ADAL 缓存的访问令牌,只需使用相同的上下文再次调用AcquireToken方法。

AuthenticationResult result = authContext.AcquireToken(resource, clientId, new Uri(redirectUrl));

之后,您在使用 Web API 时再一次使用 result.AccessToken 设置授权标头,或者使用组织服务时使用 HeaderToken 设置授权标头。

httpClient.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Bearer", result.AccessToken);

在运行时发现权限

身份验证权限 URL 和资源 URL 可以在运行过程中使用以下 ADAL 代码动态确定。 与之前在代码段中显示的众所周知的权限 URL 相比,推荐使用此方法。

AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(
                        new Uri("https://mydomain.crm.dynamics.com/api/data/")).Result;

String authorityUrl = ap.Authority;
String resourceUrl  = ap.Resource;

对于 Web API,还有一种获取权限 URL 的方法是向不指定访问令牌 Web 服务发送任何消息请求。 此方法称为持有者挑战。 对响应进行分析后获得权限 URL。

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", “”);

另请参阅

演练:使用 Azure Active Directory 注册 Dynamics 365 应用程序
多重身份验证文档
OAuth 2.0

Microsoft Dynamics 365

© 2017 Microsoft。 保留所有权利。 版权