【发布时间】:2016-03-01 05:26:47
【问题描述】:
我创建了一个 ASP.NET MVC 应用程序并使用 OpenIDConnect 配置了 Azure AD 的身份验证。我在一个 Azure AD 中创建了一个用户,并在另一个具有正确权限的 Azure AD 中添加了该用户。 我将 Azure AD 身份验证后返回的声明存储在 ADAL 缓存中。我使用这个声明(令牌缓存)来调用各种 Azure 服务管理 API。
ClientCredential credential = new ClientCredential(ConfigurationManager.AppSettings["ida:ClientID"],
ConfigurationManager.AppSettings["ida:Password"]);
// initialize AuthenticationContext with the token cache of the currently signed in user, as kept in the app's EF DB
AuthenticationContext authContext = new AuthenticationContext(
string.Format(ConfigurationManager.AppSettings["ida:Authority"], organizationId), new ADALTokenCache(signedInUserUniqueName));
AuthenticationResult result = authContext.AcquireTokenSilent(ConfigurationManager.AppSettings["ida:AzureResourceManagerIdentifier"], credential,
new UserIdentifier(signedInUserUniqueName, UserIdentifierType.RequiredDisplayableId));
var token= result.AccessToken;
通过在我的帐户/登录控制器/操作中添加以下内容,我已将我的应用程序配置为支持多租户。
public void SignIn(string directoryName = "common")
{
// Send an OpenID Connect sign-in request.
if (!Request.IsAuthenticated)
{
HttpContext.GetOwinContext().Environment.Add("Authority", string.Format(ConfigurationManager.AppSettings["ida:Authority"] + "OAuth2/Authorize", directoryName));
HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
现在,成功登录后,返回的声明属于用户最初在其中注册的原始 Azure AD。因此,用于调用用户所在的任何其他 Azure AD 的管理 api 的声明还添加了,不起作用并抛出异常“Acquire Token failed to get token”。
我在运行时将另一个 Azure AD 的名称添加到变量“directoryName”中。这次获得的声明适用于 Azure AD。
如何在登录时不明确提及 Azure AD 名称的情况下为多租户应用程序获取 SSO,这将为我提供适用于用户注册的所有 Azure AD 的声明。
请推荐。 提前致谢, 拉胡尔
【问题讨论】:
-
愚蠢的问题:您是否将应用程序配置为多租户?
-
是的,我这样做了。它被配置为多租户。用户“abc@abcdef.onmicrosoft.com”最初位于“abcdef.onmicrosoft.com”AD 中。使用相同的用户名,用户在“xyz.onmicrosoft.com”AD 中注册,标签为“来源:另一个 Azure AD”。登录 Azure 门户后,用户可以看到这两个目录。但是,当用户使用应用程序的 Azure 登录时,声明可能只属于一个目录。正是这个原因,它对另一个目录失败了。如何通过多租户配置实现 SSO。请指导。
标签: azure azure-active-directory