我使用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的声明。
请建议。 提前致谢, 拉胡尔
答案 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;