2017-11-29 8 views
0

에 ClientCredentials를 사용하여 토큰을 가져올 수 없습니다 및 클라이언트 자격 증명을 얻고 이하의 코드를에서 사용하기 위해 푸른 그것을 등록 :AcquireTokenAsync 방법 - 나는 CRM에서 데이터를 검색하려면 여기

using Microsoft.Crm.Sdk.Messages; 
using Microsoft.IdentityModel.Clients.ActiveDirectory; 
using Microsoft.Xrm.Sdk; 
using Microsoft.Xrm.Sdk.WebServiceClient; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CRM_WebAPI_Test1 
{ 
    class Program 
    { 
     static void Main(string[] atrgs) 
     { 
      MainAsync(); 
     } 
     static async void MainAsync() 
     { 
      try 
      { 
       string organizationUrl = "https://OrgName<<URL>>.com"; 
       string clientId = "xxxxxxxxx-xxxx-xxxx-b7ca-xxxx"; 
       string clientSecret = "key received from Azure App Registration"; 
       string aadInstance = "https://login.microsoftonline.com/"; 
       string tenantID = "orgname"; 

       ClientCredential clientCredentials = new ClientCredential(clientId, clientSecret); 
       AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID); 
       AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(organizationUrl, clientCredentials); 
       var requestedToken = authenticationResult.AccessToken; 

       using (var sdkService = new OrganizationWebProxyClient(GetServiceUrl(organizationUrl), false)) 
       { 
        sdkService.HeaderToken = requestedToken; 

        OrganizationRequest request = new OrganizationRequest() 
        { 
         RequestName = "WhoAmI" 
        }; 

        WhoAmIResponse response = sdkService.Execute(new WhoAmIRequest()) as WhoAmIResponse; 
        Console.WriteLine(response.UserId); 

        Console.WriteLine("Press any key to exit..."); 
        Console.ReadLine(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 

       Console.WriteLine("Press any key to exit..."); 
       Console.ReadLine(); 
      } 
     } 
     static private Uri GetServiceUrl(string organizationUrl) 
     { 
      return new Uri(organizationUrl + @"/xrmservices/2011/organization.svc/web?SdkClientVersion=8.2"); 
     } 
    } 
} 

를하지만 때를 행 온 :

authenticationResult authenticationResult = authenticationContext.AcquireTokenAsync (organizationUrl, clientCredentials)을 기다리고;

프로그램을 직접 출력하고 출력을 제공하지 않으며 catch 예외 부분에 도달하지 않습니다. 내가 여기서 누락 된 것이 있습니까?

또한 Azure AD에 응용 프로그램을 등록하는 동안 임차인 이름을 아는 방법은 무엇입니까?

UPDATE :는 [코멘트 섹션에서 전체 오류를 기록 할 수없는이 때문에 맨 손으로하시기 바랍니다 있기 때문에 문제의 업데이트.]는 다음과 같이 오류를 던지고 제안으로 코드를 변경 적용한 후 :

마이크로 소프트 .IdentityModel.Clients.ActiveDirectory.AdalServiceException : AADSTS50001 : https://orgname.com이라는 응용 프로그램이 mydirectory.onmicrosoft.com이라는 테넌트에없는 이라는 이름의 응용 프로그램입니다. 응용 프로그램이 임차인의 관리자에 의해 설치되지 않았거나 임차인의 모든 사용자가 동의 한 경우 이 발생할 수 있습니다. 이 잘못된 임차인에게 인증 요청을 보냈을 수 있습니다. 추적 ID : 58b1b994-eac3-4209-b553-4cea6a120500 상관 관계 ID : fb8a3f3a-8b0c-4cea-90fa-88ea6e9a7208 타임 스탬프 : 2017년 11월 29일 09 : 09 : 37Z ---> System.Net.Http.HttpRequestException : 응답 상태 코드가 성공을 나타내지 않습니다 : 400 (BadRequest). ---> Microsoft.IdentityModel.Clients.ActiveDirectory.AdalException : { "오류": "invalid_resource", "ERROR_DESCRIPTION": "AADSTS50001 : https://orgname.com를라는 응용 프로그램이라는 임차인에서 찾을 수 없습니다 mydirectory.onmicrosoft.com 이는 응용 프로그램이 임차인 의 관리자가 설치하지 않았거나 임차인의 사용자가 동의하지 않은 경우 발생할 수 있습니다. 인증 요청을 잘못된 임차인에게 보냈을 수 있습니다. \ r \ nTrace ID : 58b1b994 - eac3-4209-b553-4cea6a120500 \ r \ n 상관 관계 ID : fb8a3f3a-8b0c-4cea-90fa-88ea6e9a7208 \ r \ nTimestamp : 2017-11-29 09 : 09 : 37Z ","error_codes ": [50001], '타임 스탬프': '2017-11-29 09 : 09 : 37Z ","trace_id ":"58b1b994-eac3-4209-b553-4cea6a120500 ","correlation_id ":"fb8a3f3a-8b0c-4cea-90fa-88ea6e9a7208 "} : 알 수없는 오류 --- 내부 예외 스택 추적 끝 --- Microsoft.IdentityModel.Clients.ActiveDirectory.HttpClientWrapper.d__31.MoveNext() 에서 --- 내부 예외 스택 추적의 끝 --- Microsoft.IdentityModel.Clients.ActiveDirectory.AdalHttpClient.d__22 1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.IdentityModel.Clients.ActiveDirectory.AdalHttpClient.<GetResponseAsync>d__21 1.MoveNext() 에서 - - 에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업)에서 예외가 발생 된 이전 위치 ---에서 스택 추적의 끝 (작업 작업) Microsoft.IdentityModel.Clients.ActiveDirectory.A cquireTokenHandlerBase.d__71. System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업)에서 MoveNext는() --- 예외가 발생 된 이전 위치에서 스택 추적의 끝 --- (작업 Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__68.MoveNext() --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess에서 예외가 발생 된 이전 위치에서 스택 추적 --- 끝 (에서 작업) 작업 작업)에서 에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서 마이크로 oft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__59.MoveNext() --- 예외가 throw 된 이전 위치의 스택 추적 끝 --- 에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__57.MoveNext에서 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (작업 일)
에서 (작업 작업)() --- 예외가 throw 된 이전 위치에서 스택 추적 끝 --- 에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__33.MoveNext() --- 예외가 있었다 이전 위치에서 스택 추적의 끝에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (작업 작업)에서 6,작업) Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__58에서 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) (작업 작업)에서 --- 발생합니다. MoveNext() --- 예외가 발생한 이전 위치의 스택 추적 끝 --- 시스템 CRM_WebAPI_Test1.Program.d__1에서 .Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification에서 (작업 작업) System.Runtime.CompilerServices.TaskAwaiter`1.GetResult (에서 (작업 작업)) E에서 .MoveNext() : \ VS_2015 \ CRM 프로젝트 \ CRM_WebAPI_Test1 \ CRM_WebAPI_Test1 \ Program.cs : 라인 31 ErrorCode가 : 상태 코드 invalid_resource : 첫째 400

+0

'organizationUrl'은 다음과 같습니다 :'https : // contoso.crm.dynamics.com'? – juunas

+0

아니요, 조직에서 만든 평가판 계정입니다. 'contoso.crm'대신에 나머지는 동일합니다. –

+0

알겠습니다. URI는 https : // yourorganisationname.crm.dynamics.com이어야합니다. – juunas

답변

1

, 당신이 async void 기능을 사용하는 당신을 (당신이 메쏘드 서명에 영향을 줄 수없는 이벤트 핸들러에서는 예외).

그래서 같은 것을해야한다 : 그것이 await를 안타 때 코드에서 기본적으로

static void Main(string[] atrgs) 
{ 
    MainAsync().GetAwaiter().GetResult(); 
} 
static async Task MainAsync() 
{ 
} 

를, 그것은 메인 및 프로그램이 종료로 돌아갑니다.

C# 7.2에서는 기본 메서드를 async Task으로 선언 할 수 있으므로 메서드는 await이 될 수 있습니다.

azure 포털에서 id을 얻을 수 있습니다.

  1. 열고 푸른 AD 블레이드 속성에
  2. 이동
  3. 당신은 세입자 ID를 다른 옵션은 어떤 확인 된 도메인 이름을 사용하는 것입니다

(예 : mydirectory.onmicrosoft.com을 찾을 수 있습니다).

+0

코드 제안을 통해 제 1 호 문제가 해결되었지만 그 이후로는 질문에서 업데이트 된 오류가 발생합니다. –