我目前正在使用Azure Active Directory进行身份验证,建立一个托管在Azure上的web应用程序,几乎解决了所有的问题,但仍然存在一个问题。如果用户在点击我的登录页面之前登录到不同的目录(在这种情况下,它是一个University Office 365的电子邮件登录),凭证似乎是缓存的,Azure试图使用它登录到我的网站,是否有一种方法可以在每次登录时强制登录屏幕,并避免重复使用缓存的凭证?
项目设置主要是标准的,ASP。. NET MVC架构与默认的Azure Active Directory身份验证设置。
谢谢!
出现错误的MS登录页面截图
我一发帖就发现了解决方案。实现了一个注销和自重定向到登录方法。代码如下:
public void SignIn(bool? signedOut)
{
// Send an OpenID Connect sign-in request.
if (!Request.IsAuthenticated)
{
// If the user is currently logged into another directory, log them out then attempt to
// reauthenticate under this directory
if (signedOut == null || signedOut == false)
{
HttpContext.GetOwinContext().Authentication.SignOut(
new AuthenticationProperties { RedirectUri = Url.Action("SignIn", "Account", routeValues: new { signedOut = true }, protocol: Request.Url.Scheme) },
OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
}
else
{
HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
}
谢谢!
有两种更好的方法来处理这个问题。首先,为您的应用程序使用特定于租户的Azure AD端点。您的authority
应该是https://login.microsoftonline.com/<name-of-your-tenant>
。这将确保只有来自您的租户的用户可以登录。但是,如果用户尝试使用不同租户的帐户登录(通过选择现有会话或启动新会话),他们将收到您截屏的错误。这是无法避免的。
如果你想确保用户每次登录你的应用程序时都输入他们的用户名/密码,你可以在登录请求中发送查询参数prompt=login
。但是要注意,这将破坏用户的SSO。