401-使用REST API动态CRM与Azure AD进行未经授权的身份验证

And*_*aca 13 rest dynamics-crm azure oauth-2.0 adal

我正在尝试使用Azure AD oAuth 2身份验证访问Dynamics CRM Online REST API.为了做到这一点,我按照以下步骤操作:

- 我在Azure中注册了一个Web应用程序和/或web api
- 将动态CRM的权限配置为具有委派权限"以组织用户身份访问CRM Online"
- 并创建了一个密钥1年到期并保留客户ID.

在Azure上配置Web应用程序后,我在.NET/C#中创建了一个控制台应用程序,它使用ADAL发出简单请求,在这种情况下检索帐户列表:

    class Program
{
    private static string ApiBaseUrl = "https://xxxxx.api.crm4.dynamics.com/";
    private static string ApiUrl = "https://xxxxx.api.crm4.dynamics.com/api/data/v8.1/";
    private static string ClientId = "2a5dcdaf-2036-4391-a3e5-9d0852ffe3f2";
    private static string AppKey = "symCaAYpYqhiMK2Gh+E1LUlfxbMy5X1sJ0/ugzM+ur0=";

    static void Main(string[] args)
    {
        AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(ApiUrl)).Result;

        var clientCredential = new ClientCredential(ClientId, AppKey);

        var authenticationContext = new AuthenticationContext(ap.Authority);
        var authenticationResult = authenticationContext.AcquireToken(ApiBaseUrl, clientCredential);

        var httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResult.AccessToken);

        var result = httpClient.GetAsync(Path.Combine(ApiUrl, "accounts")).Result;         
    }
}
Run Code Online (Sandbox Code Playgroud)

我成功检索了一个访问令牌,但是当我尝试对CRM进行httprequest时,我总是得到一个401 - 未经授权的状态代码.我错过了什么?

Van*_*yen 10

谢谢大家的回答.我终于使用ADAL 3访问了Dynamics CRM OData API.

由于许多人在执行此操作时仍遇到问题,请参阅以下步骤:

应用注册

  1. 登录到portal.azure.com使用您的Dynamics CRM中的订阅您的Office 365管理员用户.

  2. 转到Azure Active Director\App注册并添加新的应用程序注册

  3. 输入"名称"和"登录URL",URL可以是任何内容(例如https:// localhost)

  4. 选择刚刚创建的注册应用程序,转到Settings\Keys

  5. 输入密钥描述,单击"保存"并复制"值"(并保留它,因为稍后您将需要它).同时复制已注册应用程序的应用程序ID.

  6. 转到"必需权限",单击"添加",选择"Dynamics CRM Online",然后选中"以组织用户身份访问CRM Online".

这些步骤使客户端应用程序可以使用您在步骤5中创建的应用程序ID和客户端密钥来访问Dynamics CRM.您的客户端应用程序现在可以通过访问CRM Online的权限对Azure AD 进行身份验证.但是,CRM Online不了解这个"客户端应用程序"或"用户".如果您尝试访问它,CRM API将响应401.

添加CRM应用程序用户

要让CRM了解"客户端应用程序"或"用户",您需要添加应用程序用户.

  1. 转到CRM \安全角色,创建新的安全角色或只复制"系统管理员"角色

  2. 转到CRM\Settings\Security\Users,创建一个新用户,将表单更改为"Application User"

  3. 使用上一步中的应用程序ID输入必填字段.保存后,CRM将自动填充Azure AD对象ID和URI.

  4. 将用户添加到从上一步创建的安全角色.

现在,您应该能够使用HttpClient和ADAL使用以下示例代码访问CRM API:

var ap = await AuthenticationParameters.CreateFromResourceUrlAsync(
                new Uri("https://*****.api.crm6.dynamics.com/api/data/v9.0/"));

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

var authContext = new AuthenticationContext(authorityUrl);
var clientCred = new ClientCredential("Application ID", "Client Secret");
var test = await authContext.AcquireTokenAsync(resourceUrl, clientCred);

Console.WriteLine(test.AccessToken);

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", test.AccessToken);

    var response = await client.GetAsync("https://*****.api.crm6.dynamics.com/api/data/v9.0/contacts");
    var contacts = await response.Content.ReadAsStringAsync();

    Console.WriteLine(contacts);
}
Run Code Online (Sandbox Code Playgroud)


And*_*aca 6

1年零2个月后,此相同代码可以完美运行。如许多人所述,Dynamics 365开始同时支持服务器到服务器(S2S)身份验证。我要做的唯一的步骤就是创建一个应用程序用户。有关如何进行此身份验证的更多信息,请访问以下网站:https : //msdn.microsoft.com/zh-cn/library/mt790170.aspx