【发布时间】:2016-11-10 04:11:02
【问题描述】:
5 周前使用 azure AD 为我的网络应用实施身份验证时出现了一些初始问题,如果用户缓存了来自另一个目录(在本例中是我的大学的)的凭据,则登录将无法正常工作。解决方案是实现以下代码:
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 = Url.Action("Dashboard", "User", routeValues: null, protocol: Request.Url.Scheme) },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
}
}
}
这实质上是强制用户退出然后立即重新登录,这个过程实际上只需要大约 1.5 秒,所以它似乎是一个很好的解决方案来擦除任何缓存的凭据。这在过去 5 周内一直有效,但突然停止在我的测试和实时系统上工作。注销将正常工作,但重定向回登录 url 不会启动,因此将用户困在附加的screenshot 的屏幕上。您可以查看指定站点here,点击登录按钮即可出现问题。
在仔细检查源代码控制后,我可以确认我最近对代码所做的任何更改都不会导致问题,看起来微软处理事情的方式似乎发生了变化。
架构:在 .NET 4.5 上运行的 Azure Web 应用
提前致谢,如果我能提供更多有用的信息,请随时告诉我,
谢谢, 克雷格
【问题讨论】:
-
所以让我直说吧。在 SignIn 操作中,如果用户未通过身份验证,并且未给出 signedOut 查询参数,则将其注销。那么一个甚至还没有登录的用户就退出了?
-
是的,这是正确的,我需要这样做,以便如果用户已经登录到不同的目录(他们的个人前景或大学电子邮件等),这些凭据将在去之前被擦除通过登录过程。据我所知,缺少此步骤有时会提示 AD 尝试使用现有的缓存凭据。
-
现在我看到了屏幕截图,我以前也看到过。但我真的不知道是什么原因造成的。尽管您是否尝试过在请求中包含客户端 ID?由于现在只有重定向 URI。 Azure AD 可能决定将用户留在那里比将其发送到某个它不知道它是否是应用的回复 URL 的 URL 更安全。
-
可以确认在请求中包含clientid后它没有产生任何影响,但感谢您的建议!
标签: c# asp.net azure azure-active-directory adal