AcquireTokenAsync方法 - 无法使用

时间:2017-11-29 07:42:51

标签: c# azure microsoft-dynamics dynamics-365

在这里,我想从CRM检索数据并在Azure中注册以获取客户端凭据并在以下代码中使用它:

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 = await   authenticationContext.AcquireTokenAsync(organizationUrl,   clientCredentials);

它直接存在于程序中,不提供任何输出,甚至没有命中catch异常部分。这里有什么我想念的吗?

此外,如何在Azure AD中注册应用程序时了解租户名称?

更新: [更新有问题,因为无法在评论部分记下整个错误,所以请光着它。]应用代码更改作为建议后,它会抛出错误,如下所示:

  

Microsoft.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   ---&GT; System.Net.Http.HttpRequestException:响应状态代码不表示成功:400(BadRequest)。 ---&GT;   Microsoft.IdentityModel.Clients.ActiveDirectory.AdalException:   {&#34;错误&#34;:&#34; invalid_resource&#34;,&#34; error_description&#34;:&#34; AADSTS50001:   名为https://orgname.com的应用程序未找到   租户名为mydirectory.onmicrosoft.com。这可能发生在   租户管理员尚未安装应用程序   或者由租户中的任何用户同意。你可能发过你的   对错误租户的身份验证请求。\ r \ nTrace ID:   58b1b994-eac3-4209-b553-4cea6a120500 \ r \ n相关ID:   fb8a3f3a-8b0c-4cea-90fa-88ea6e9a7208 \ r \ n时间戳:2017-11-29   09:09:37Z&#34;&#34; error_codes&#34;:[50001]&#34;时间戳&#34;:&#34; 2017年11月29日   09:09:37Z&#34;&#34; trace_id的&#34;:&#34; 58b1b994-eac3-4209-b553-4cea6a120500&#34;&#34; CORRELATION_ID&#34;:&#34; fb8a3f3a- 8b0c-4cea-90fa-88ea6e9a7208&#34;}:   未知错误---内部异常堆栈跟踪结束--- at   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()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__71.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__68.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__59.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
  在   Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase.d__57.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__33.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.d__58.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()   在CRM_WebAPI_Test1.Program.d__1.MoveNext()中   E:\ VS_2015 \ CRM   Projects \ CRM_WebAPI_Test1 \ CRM_WebAPI_Test1 \ Program.cs:第31行           ErrorCode:invalid_resource           StatusCode:400

1 个答案:

答案 0 :(得分:1)

首先,您使用的是async void函数,您不应该这样做(事件处理程序除外,您不能影响方法签名)。

所以它应该是这样的:

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

基本上在你的代码中遇到await时,它会返回Main并退出程序。

在C#7.2中,您还可以将主方法声明为async Task,这样您就可以await方法。

您可以从Azure门户获取租户 id

  1. 打开Azure AD刀片
  2. 转到“属性”
  3. 您可以找到租户ID
  4. 另一种选择是使用任何经过验证的域名(例如mydirectory.onmicrosoft.com)。