개념 증명을 위해 Dynamics CRM 2016 웹 API에 HTTP GET 요청을하는 데 문제가 있습니다.Dynamics CRM 웹 api 401 Oauth 토큰을 획득 한 후 인증되지 않음
조직 고객으로 Dynamics CRM에 대한 액세스 권한이 부여 된 Azure Active Directory에 멀티 테넌트 웹 응용 프로그램을 만들려면 this walk-through을 따라 왔습니다.
액세스 토큰을 얻기 위해 this example code을 사용했습니다. 이것은 유효한 토큰처럼 보이는 것을 제공하면서 작동하는 것처럼 보입니다.
토큰을 사용하여 간단한 GET 요청을 수행합니다.이 토큰은 401 Unauthorized
으로 실패합니다. 코드 :
class Test
{
public async Task RunAsync()
{
var resource = "https://<snip>.crm4.dynamics.com/api/data/v8.1/";
var authParams = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(resource))
.Result;
var authorityUrl = authParams.Authority;
var resourceUrl = authParams.Resource;
var clientId = "<snip>";
var client_secret = "<snip>";
var clientCredential = new ClientCredential(clientId, client_secret);
var authContext = new AuthenticationContext(authorityUrl, false);
var token = authContext.AcquireToken(resourceUrl, clientCredential);
var response = await CallApiAsync($"{resourceUrl}api/data/v8.1/accounts?$select=name&$top=3", token.AccessToken);
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(response.RequestMessage);
Console.WriteLine(response.Headers);
Console.WriteLine(response.ReasonPhrase);
Console.WriteLine(content);
}
private async Task<HttpResponseMessage> CallApiAsync(string uri, string token)
{
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");
return await httpClient.GetAsync(uri);
}
}
}
요청 :
Method: GET, RequestUri: 'https://<snip>.crm4.dynamics.com/api/data/v8.1/accounts?$select=name&$top=3', Version: 1.1, Content: <null>, Headers:
{
Authorization: Bearer <snip>
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
}
응답 : 나는 분명 뭔가 빠진 것 같은 기분
REQ_ID: <snip>
Strict-Transport-Security: max-age=31536000; includeSubDomains
Date: Tue, 21 Feb 2017 15:08:39 GMT
Set-Cookie: crmf5cookie=<snip>;secure; path=/
Server: Microsoft-IIS/8.5
WWW-Authenticate: Bearer authorization_uri=https://login.windows.net/<snip>/oauth2/authorize,resource_id=https://<snip>.crm4.dynamics.com/
X-Powered-By: ASP.NET
Unauthorized
HTTP Error 401 - Unauthorized: Access is denied
?
후자의 접근 방식을 사용하여 :) 이제는 AcquireToken (resourceUrl, clientId, userCredential)에 대한 예외가 생겼습니다. : AADSTS70002 : 요청 본문에는 'client_secret 또는 client_assertion' 매개 변수가 있어야합니다. 더 이상의 도움을 주시면 감사하겠습니다. 클라이언트 인증 정보와 사용자 인증 정보를 받아들이는 과부하가 아닌 것 같습니다. – ImDarrenG
인증을 CRM 사용자로 사용하고 Azure AD에서 웹 API가 아닌 Web API로 설정하면 작동합니다. – ImDarrenG
여기 내 대답을 확인하십시오 http://stackoverflow.com/a/43164164/1063168 – PhuocLe