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.
由于许多人在执行此操作时仍遇到问题,请参阅以下步骤:
登录到portal.azure.com使用您的Dynamics CRM中的订阅您的Office 365管理员用户.
转到Azure Active Director\App注册并添加新的应用程序注册
输入"名称"和"登录URL",URL可以是任何内容(例如https:// localhost)
选择刚刚创建的注册应用程序,转到Settings\Keys
输入密钥描述,单击"保存"并复制"值"(并保留它,因为稍后您将需要它).同时复制已注册应用程序的应用程序ID.
转到"必需权限",单击"添加",选择"Dynamics CRM Online",然后选中"以组织用户身份访问CRM Online".
这些步骤使客户端应用程序可以使用您在步骤5中创建的应用程序ID和客户端密钥来访问Dynamics CRM.您的客户端应用程序现在可以通过访问CRM Online的权限对Azure AD 进行身份验证.但是,CRM Online不了解这个"客户端应用程序"或"用户".如果您尝试访问它,CRM API将响应401.
要让CRM了解"客户端应用程序"或"用户",您需要添加应用程序用户.
转到CRM \安全角色,创建新的安全角色或只复制"系统管理员"角色
转到CRM\Settings\Security\Users,创建一个新用户,将表单更改为"Application User"
使用上一步中的应用程序ID输入必填字段.保存后,CRM将自动填充Azure AD对象ID和URI.
将用户添加到从上一步创建的安全角色.
现在,您应该能够使用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)
1年零2个月后,此相同代码可以完美运行。如许多人所述,Dynamics 365开始同时支持服务器到服务器(S2S)身份验证。我要做的唯一的步骤就是创建一个应用程序用户。有关如何进行此身份验证的更多信息,请访问以下网站:https : //msdn.microsoft.com/zh-cn/library/mt790170.aspx
| 归档时间: |
|
| 查看次数: |
12605 次 |
| 最近记录: |