【问题标题】:Configuring ASP.Net application to support muliti tenant using Azure AD account使用 Azure AD 帐户配置 ASP.Net 应用程序以支持多租户
【发布时间】: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


【解决方案1】:

我不确定你的参数signedInUserUniqueName是什么,我经常这样写来获取accesstoken:

 AuthenticationContext authenticationContext = new AuthenticationContext("https://login.windows.net/" + Properties.Settings.Default.TenantID);
            ClientCredential credential = new ClientCredential(clientId: Properties.Settings.Default.ClientID, clientSecret: Properties.Settings.Default.ClientSecretKey);
            AuthenticationResult result = authenticationContext.AcquireToken(resource: "https://management.core.windows.net/", clientCredential: credential);
            var token = result.AccessToken;

【讨论】:

  • 当应用程序已添加到您在代码中引用其 TenantID 的租户中时,此方法有效。对于多租户应用程序,应用程序会在该租户的登录用户授权后添加到 Azure 租户中。问题在于属于多个 Azure AD 的用户的登录。如何获取支持代表该登录用户进行的多个 Azure AD 图形 API 调用的声明。目前,获得的索赔是特定于租户的。但是,如果您是多个 Azure AD 的一部分,为什么不能获得支持您注册的多个 AD 的声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2021-07-20
相关资源
最近更新 更多