我希望使用在线Microsoft动态的用户通过OAuth2向我们提供对其帐户的访问权限。为了清楚起见,我的用户住在他们自己的租户中,而不是我的租户。
因此,我注册了Azure AD应用程序并将其设置为多租户,但授权URL需要资源ID,这是MS Dynamics上的确切客户URL。喜欢
https://{orgid}.crm.dynamics.com
但我不希望用户手动输入他们的网址。我想在OAuth过程中自动计算出他们的资源ID并完成整个过程。
我该怎么办?
顺便说一下,我没有使用C#,如果可以提供HTTP调用,我将不胜感激。
答案 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是实现这一目标的关键。