配置ASP.Net应用程序以使用Azure AD帐户支持多租户

时间:2016-03-01 05:26:47

标签: azure azure-active-directory

我使用OpenIDConnect创建了一个ASP.NET MVC应用程序并使用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;

我已通过在我的帐户/ SignIn控制器/操作中添加以下内容来配置我的应用程序以支持多租户。

 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,其中用户是还添加,不起作用并抛出异常,因为“获取令牌未能获得令牌”。

我在运行时将其他Azure AD的名称添加到变量“directoryName”。这次获得的声明适用于Azure AD。

如何在登录时未明确提及Azure AD名称获取多租户应用程序的SSO,这将为我提供可用于注册用户的所有Azure AD的声明。

请建议。 提前致谢, 拉胡尔

1 个答案:

答案 0 :(得分:0)

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

 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;