【问题标题】:Get Customer Resource Id with Multi Tenant OAuth on Microsoft Dynamics使用 Microsoft Dynamics 上的多租户 OAuth 获取客户资源 ID
【发布时间】:2023-12-30 19:43:02
【问题描述】:

我希望使用在线 Microsoft 动态的我的用户允许我们通过 OAuth2 访问他们的帐户。需要明确的是,我的用户住在他们自己的租户中,而不是我的租户的一部分。

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

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

但我不希望用户手动输入他们的 URL。我想在 OAuth 过程中自动找出他们的资源 id 并完成该过程。

我该怎么做?

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

【问题讨论】:

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


    【解决方案1】:

    最近我一直在处理一些需要通过 OAuth2 访问 D365 的多租户 Web 应用程序。虽然我没有声称已经掌握了它,但我已经让一些这样的应用程序正常工作。

    这里有一些想法给你:

    我没有尝试将tenantId 放入CRM url。为了构建 CRM url,我使用了 org“url name”,您可以使用以下代码获取它。

    此代码假定您已将基本 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 是在建立身份验证上下文时 var authContext = new AuthenticationContext($"https://login.windows.net/{tenantID}");

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

    如果您想了解一下,可以查询 Discovery 服务以查看用户可以访问哪些组织。对我来说,Colin Vermander's article 是让它发挥作用的关键。

    【讨论】:

    • 非常感谢您分享您的经验 Aron。我实际上是说 org id。我修好了。我也在使用login.windows.net/common。 Colin Vermander 的文章似乎是关键。我要检查并报告。非常感谢
    • 我收到此请求的授权已被拒绝。按照博客的确切顺序。因此,我通过发现服务的 OAuth 交换获得的有效令牌不适用于发现服务。我正在使用全局管理员通过 oauth 进行身份验证。有什么想法吗?
    最近更新 更多