在尝试login.claimsIdentity IsAuthenticated FALSE之后,Owin和katana应用程序

时间:2014-10-09 11:48:40

标签: asp.net-mvc-4 azure owin katana claims

我们正在为我们的应用程序使用Microsoft Owin身份验证,该应用程序将用户重定向到Azure Active Directory登录页面。成功登录后,将显示我们的应用程序主页。

这几次都没有任何问题。但是,经过几次尝试后,如果我再次尝试登录,则单击“Azure Active Directory登录页面”的“登录”按钮后,它将不会重定向到我们的主页。它加载一个空白页面,它永远不会完成加载,它会被挂起。地址栏显示我们的主页和天蓝色登录页面的请求切换。

以下是用于登录的代码:

 public void SignIn()
 {
     if (!Request.IsAuthenticated)
     {
         HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/Home/Index" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
     }
 }

更新 1:

面对新问题:

你好Vittorio,

谢谢!为你的共鸣。 正如您所提到的,在删除Authorize属性后,它在本地工作正常(来自sourcecode)。但是,一旦我们将其部署到azure,经过几次登录尝试,我们面临着一个不同的问题,在这里,我们根本不允许登录。由于身份验证失败并且重定向到错误页面(自定义页面),用户详细信息未加载。

以下是我们用于获取用户详细信息的一段代码,但是,很多时候我们进入ELSE部分(claimsIdentity.IsAuthenticated返回FALSE)。

var claimsIdentity = User.Identity as ClaimsIdentity;
if (claimsIdentity.IsAuthenticated) {
    accesstoken = claimsIdentity.FindAll("urn:accesstoken:access_token").FirstOrDefault().Value;
    domainname = claimsIdentity.FindAll("urn:appdomain:domain").FirstOrDefault().Value;
} else {
    return RedirectToAction("Error", "Home");
}

如果我们遗漏了任何内容,请告诉我们。

2 个答案:

答案 0 :(得分:2)

从您的描述中看起来您正在经历一个循环,其中流程不断转到Azure AD并返回到您的应用程序。那是对的吗? 通常,当您尝试访问需要身份验证/授权的一个资源(例如,通过[授权]修饰)并且您有一些状态会自动使用不满足资源的访问控制要求的用户对您进行身份验证时,会发生这种情况。另一个重定向并触发一个新的循环。

要寻找的东西:

  • 用[Authorize()]修饰的资源。您可能拥有不满足条件的用户的有效令牌。解决方案:实现自定义过滤器,返回403而不是401以获取授权问题。
  • 当您在应用程序中登录时,您从Azure AD注销并使用另一个Azure AD用户表单登录另一个目录。如果您需要能够这样做,您应该将中间件设置为被动(通过AuthenticationMode = AuthenticationMode.Passive),以便401s不会自动触发到Azure AD的往返。请注意,这可能也适用于上述内容

如果这解决了,请告诉我们! HTH 诉

答案 1 :(得分:0)

原因是Owin在不同的位置存储cookie,而System.Web存放在不同的位置。

在OWIN中,响应头集合是响应cookie的主存储位置。但是,System.Web将响应cookie存储在单独的HttpContext.Response.Cookies集合中,然后在发送响应之前将它们写入Response.Headers集合。如果两个方法都在同一个请求上使用,那么这可能会导致冲突,因为Response.Cookies集合将覆盖通过OWIN响应头设置的任何cookie。

有关详细信息,请参阅this

重新配置CookieAuthenticationMiddleware直接写入System.Web的cookie集合

相关问题