如何使用ADAL / OAuth向CRM Online进行身份验证并通过令牌请求数据?

埃克拉斯克

我有多个CRM Online实例,这些实例由Microsoft托管在云中。
它们都由本身由ADFS管理的同一Azure Active Directory保护。
我的应用程序已在Azure AD中注册,因此具有客户端ID /密钥等以及CRM的权限。

我想通过Web API连接到CRM的特定实例以请求数据。
我可以通过使用CrmServiceClient包含用户名/密码的连接字符串来使其工作。
这似乎是通常记录的示例,但我不想这样做。以下MSDN文章使它看起来像我可以通过令牌来代替:https : //msdn.microsoft.com/en-us/library/gg327838.aspx

我可以成功获得这样的令牌(为了安全起见,我已经模糊了一些细节):

var tenantName = @"myorg.onmicrosoft.com";
var authString = string.Format(@"https://login.microsoftonline.com/{0}", tenantName);

var authContext = new AuthenticationContext(authString, false);

// I am in the UK so use crm4
var resource = @"https://myorg.crm4.dynamics.com";
var clientId = @"899ac540-2134-1234-abcd-2d6440046630";
var key = @"nStbgtfe0oybU1P5+/FQ4wFn1oLTEDr5M7Kjrghf5yh=";
var clientCred = new ClientCredential(clientId, key);

var authResult = await authContext.AcquireTokenAsync(resource, clientCred);

通常,我会将此令牌作为身份验证标头传递给HttpRequest,但此博客上的选项3建议您可以改用OrganizationWebProxyClientSDK提供类:http : //crmtipoftheday.com/2015/06/24/you-have -oauth-token-now-What /

var orgService = new OrganizationWebProxyClient(
    new Uri("https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc"), false)
{
    HeaderToken = authResult.AccessToken,
    SdkClientVersion = "8"
};

最后,我需要添加对Microsoft提供的组织服务的服务引用:

https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc?singleWSDL&sdkversion=8

这将在我的app.config中创建一个绑定:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="CustomBinding_IOrganizationService">
        <textMessageEncoding />
        <httpsTransport />
      </binding>
    </customBinding>
  </bindings>
  <client>
    <endpoint address="https://myorg.api.crm4.dynamics.com/XRMServices/2011/Organization.svc"
    binding="customBinding" bindingConfiguration="CustomBinding_IOrganizationService"
    contract="CRMOrgService.IOrganizationService" name="CustomBinding_IOrganizationService" />
  </client>
 </system.serviceModel>

然后,我可以将其分配给组织服务:

var binding = new CustomBinding("CustomBinding_IOrganizationService");
orgService.Endpoint.Binding = binding;

最后,我可以调用Web服务:

var contacts = orgService.RetrieveMultiple(new QueryExpression
{
    EntityName = "contact",
    ColumnSet = new ColumnSet("firstname", "lastname")
})
.Entities
.Select(item => item.ToEntity<Contact>());

但是,在调用组织服务时出现错误:

验证邮件的安全性时发生错误

我被认为是这个错误实际上会吞噬真正的错误(感谢Microsoft),所以我不知道真正的错误是什么。
在线上的许多文档都说客户端和服务器时间不同步,但我认为不是这样。我无法证明微软服务器的几点钟,但我的时钟绝对准确,并且在英国的正确时区内。

有人知道我在做什么错吗?
或者,有没有用户名/密码的身份验证方法吗?
还是我只是树错了树,毕竟我应该使用用户名/密码吗?

埃克拉斯克

似乎CRM Online不支持任何形式的匿名或被动身份验证,并且必须始终提供有效的用户名和密码。

我仅通过简单地创建一个仅用于API访问的用户,并使用这些凭据来向CRM进行身份验证。尽管这不是我想要的,但它确实可以正常工作。

我希望有人能证明我错了,但现在看来这不可能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用OAuth2以编程方式向Google进行身份验证

如何使用Go的net / http基于身份验证向主从数据库分发请求?

使用令牌向GitHub进行身份验证

如何向GuzzleHTTP请求对象添加身份验证以进行异步处理

如何使用个人访问令牌向Visual Studio Team Services和Team Foundation Server进行身份验证?

如何通过使用OAuth 1.0身份验证的Upwork API通过jQuery AJAX请求JSONP文件?

ADAL v3:如何使用UserPasswordCredential进行身份验证?

使用oauth令牌通过imap连接到Gmail时,身份验证失败

使用ADAL进行Azure AD OAuth身份验证:什么是资源ID?

如何使用OAuth进行身份验证以访问EWS API

如何使用Meteor.js通过oauth 1.0向500px api进行身份验证的请求

通过Slack OAuth进行身份验证后如何识别现有用户?

无法使用Windows身份验证从ASP.NET应用使用个人访问令牌向Azure DevOps进行身份验证

使用Python请求进行Magiccardmarket的OAuth身份验证

确定使用我的用户名和在GitHub中生成的令牌的请求向GitHub进行身份验证吗?

是否可以通过Java Azure SDK使用服务主体向CosmosDB进行身份验证?

如何通过OAuth通过CData ODBC驱动程序对Salesforce进行身份验证?

向JSON REST API进行身份验证时如何获取会话令牌(在R中)

如何使用Qt和访问令牌向GitHub进行身份验证

如何从Google Cloud获取OAuth2身份验证令牌(代号为1),然后使用它向云自然语言API发出请求

使用Azure AD通过OAuth2对Azure API管理进行身份验证

OAuth:通过身份验证后,通过路由使用访问令牌

使用令牌通过令牌进行身份验证,如果令牌失败,则通过会话进行身份验证?

如何修改Chrome扩展程序,以通过Google的OAuth 2对每个用户进行身份验证?

哪种Oauth流最适合使用javascript SPA进行令牌身份验证

通过POST使用请求库进行python身份验证

如何刷新令牌而不必再次通过身份验证?OAuth2

如何使用令牌身份验证对 Post 请求进行身份验证?

如何使用 HTTR 在 R 中自动进行 YouTube OAuth 身份验证/重新身份验证