在Microsoft Dynamics上获取具有多租户OAuth的客户资源ID

时间:2018-04-12 03:07:05

标签: oauth-2.0 dynamics-crm microsoft-dynamics dynamics-crm-online

我希望使用在线Microsoft动态的用户通过OAuth2向我们提供对其帐户的访问权限。为了清楚起见,我的用户住在他们自己的租户中,而不是我的租户。

因此,我注册了Azure AD应用程序并将其设置为多租户,但授权URL需要资源ID,这是MS Dynamics上的确切客户URL。喜欢

https://{orgid}.crm.dynamics.com

但我不希望用户手动输入他们的网址。我想在OAuth过程中自动计算出他们的资源ID并完成整个过程。

我该怎么办?

顺便说一下,我没有使用C#,如果可以提供HTTP调用,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

最近,我一直在与一些需要通过OAuth2访问D365的多租户网络应用进行工作/摔跤。虽然我没有声称已经掌握了它,但我已经有一些这样的应用程序正在运行。

以下是您的一些想法:

我没有尝试将tenantId放入CRM网址。要构建CRM网址,我使用org" url name",您可以使用以下代码获取。

此代码假定您已将基本网址放入appSettings的{​​{1}}节点: web.config

然后这段代码可能会帮助你:

<add key="ida:OrganizationHostName" value="https://{0}.crm.dynamics.com" />

我已经看到使用的租户ID是在建立auth上下文时 private string getOrgName(string user) { var a = user.IndexOf('@'); var b = user.IndexOf('.'); return user.Substring(a + 1, b - (a + 1)); } var signedInUserID = ClaimsPrincipal.Current.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier).Value; var tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value; var userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; var OrganizationHostName = ConfigurationManager.AppSettings["ida:OrganizationHostName"]; var organizationName = getOrgName(User.Identity.Name); var resource = string.Format(OrganizationHostName, organizationName);

如上所示,您可以从var authContext = new AuthenticationContext($"https://login.windows.net/{tenantID}");获取,但我认为我的应用现在都使用ClaimsPrincipal而不是附加tenantId。

如果您想获得想象力,可以查询Discovery服务以查看用户有权访问的组织。对我而言,Colin Vermander's article是实现这一目标的关键。