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

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

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

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

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

我怎么能这样做?

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

回答(1)

2 years ago

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

以下是一些想法:

我没有尝试将tenantId放入CRM网址 . 要构建CRM网址,我使用组织“网址名称”,您可以使用以下代码获取 .

此代码假定您已将基本URL放入 web.configappSettings 节点: <add key="ida:OrganizationHostName" value="https://{0}.crm.dynamics.com" />

那么这段代码可能会帮助你:

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);

我在哪里看到使用的租户ID是在 Build 认证上下文时 var authContext = new AuthenticationContext($"https://login.windows.net/{tenantID}");

如上所示,您可以从 ClaimsPrincipal 获取它,但我认为我的应用程序现在都使用 https://login.windows.net/common 而不是附加tenantId .

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