在这里,我想从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
答案 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 。
另一种选择是使用任何经过验证的域名(例如mydirectory.onmicrosoft.com)。