2017-02-22 4 views
1

개념 증명을 위해 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 

?

답변

3

사용중인 CRM 조직 사용자가 없습니다. 이 Server to Server Auth 자습서를 확인하십시오. 응용 프로그램 사용자를 만들어야합니다. Tip of the Day for Server to Server Auth에 대한 설명이 조금 더 있습니다.

서버 대 서버 인증 외부 : authenticate as a CRM user using creds this way.

+0

후자의 접근 방식을 사용하여 :) 이제는 AcquireToken (resourceUrl, clientId, userCredential)에 대한 예외가 생겼습니다. : AADSTS70002 : 요청 본문에는 'client_secret 또는 client_assertion' 매개 변수가 있어야합니다. 더 이상의 도움을 주시면 감사하겠습니다. 클라이언트 인증 정보와 사용자 인증 정보를 받아들이는 과부하가 아닌 것 같습니다. – ImDarrenG

+0

인증을 CRM 사용자로 사용하고 Azure AD에서 웹 API가 아닌 Web API로 설정하면 작동합니다. – ImDarrenG

+0

여기 내 대답을 확인하십시오 http://stackoverflow.com/a/43164164/1063168 – PhuocLe