指定重定向时 AAD 身份验证后的无限重定向循环
Infinite re-direct loop after AAD Authentication when redirect is specified
如果我像这样在 OpenIdConnectAuthenticationOptions 中指定重定向 URI
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = Authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
RedirectUri = redirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
然后我得到一个无限重定向循环。只有当我将它放在独立的 IIS 服务器(我们的测试服务器)上时才会发生这种情况。如果我删除 AAD 中的所有重播 url,并只保留测试服务器的设置,并从上面删除 "RedirectUri = redirectUri,",我的问题就会消失。
我这里有一个 fiddler 日志:https://drive.google.com/file/d/0B5Ap95E_wdyAa0RLLWloZ0dCaGM/view?usp=sharing
看来,当来自 AAD 的请求返回到我的应用程序时,在获取和使用令牌之前,中间件只是用 302 将其弹回。另外可能重要的是,我有 [Authorize ] 路由和 return uri 指向的 mvc 控制器上的属性。如果我删除它,我就不会遇到这个问题。
[更新]
我尝试将应用程序移动到我的本地主机安装的 IIS,而不是使用 iisexpress,这样我就可以像在我的 iis 服务器上一样设置为子应用程序。在我的本地主机上,它执行相同的无限循环。我在覆盖 [Authorize] 属性时添加了一些遥测自定义事件,并且能够发现当页面在身份验证后重定向回应用程序时 httpContext.user.identity.IsAuthenticated = false。所以不知何故 OWIN 中间件没有将其设置为 true?
感谢您的帮助!
我找到了解决问题的方法。最初我指定我的回复 url 指向网站的根目录。我的路由配置如下所示:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Welcome", action = "Index", id = UrlParameter.Optional }
);
如果我将 "Welcome" 附加到我的回复 url 末尾,它就会起作用。出于某种原因,如果我将回复 url 留在站点的根目录并选择默认路由,它只会进入无限循环。
我还发现这仅适用于站点的子应用程序。我尝试将我的应用程序移动到 iis 中的独立站点,而不是我不必在回复中添加控制器名称 url。
示例:
原回复url:
mysite.mydomain.com/CustomApp
新回复url:
mysite.mydomain.com/CustomApp/欢迎
希望其他人能发现这个有用!
更新
我发现问题的根源仍然是这个mvc5 bug:katanaproject.codeplex.com/workitem/197。我以为它已经修复了,但没有,所以我将继续使用众所周知的 Kentor Owin Cookie Saver:github.com/Sustainsys/owin-cookie-saver
通过对 CookieSecureOption 使用 Never 选项解决
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieSecure = CookieSecureOption.Never
})
如果我像这样在 OpenIdConnectAuthenticationOptions 中指定重定向 URI
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = Authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
RedirectUri = redirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error?message=" + context.Exception.Message);
return Task.FromResult(0);
}
}
});
然后我得到一个无限重定向循环。只有当我将它放在独立的 IIS 服务器(我们的测试服务器)上时才会发生这种情况。如果我删除 AAD 中的所有重播 url,并只保留测试服务器的设置,并从上面删除 "RedirectUri = redirectUri,",我的问题就会消失。
我这里有一个 fiddler 日志:https://drive.google.com/file/d/0B5Ap95E_wdyAa0RLLWloZ0dCaGM/view?usp=sharing
看来,当来自 AAD 的请求返回到我的应用程序时,在获取和使用令牌之前,中间件只是用 302 将其弹回。另外可能重要的是,我有 [Authorize ] 路由和 return uri 指向的 mvc 控制器上的属性。如果我删除它,我就不会遇到这个问题。
[更新] 我尝试将应用程序移动到我的本地主机安装的 IIS,而不是使用 iisexpress,这样我就可以像在我的 iis 服务器上一样设置为子应用程序。在我的本地主机上,它执行相同的无限循环。我在覆盖 [Authorize] 属性时添加了一些遥测自定义事件,并且能够发现当页面在身份验证后重定向回应用程序时 httpContext.user.identity.IsAuthenticated = false。所以不知何故 OWIN 中间件没有将其设置为 true?
感谢您的帮助!
我找到了解决问题的方法。最初我指定我的回复 url 指向网站的根目录。我的路由配置如下所示:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Welcome", action = "Index", id = UrlParameter.Optional }
);
如果我将 "Welcome" 附加到我的回复 url 末尾,它就会起作用。出于某种原因,如果我将回复 url 留在站点的根目录并选择默认路由,它只会进入无限循环。
我还发现这仅适用于站点的子应用程序。我尝试将我的应用程序移动到 iis 中的独立站点,而不是我不必在回复中添加控制器名称 url。
示例:
原回复url:
mysite.mydomain.com/CustomApp
新回复url: mysite.mydomain.com/CustomApp/欢迎
希望其他人能发现这个有用!
更新
我发现问题的根源仍然是这个mvc5 bug:katanaproject.codeplex.com/workitem/197。我以为它已经修复了,但没有,所以我将继续使用众所周知的 Kentor Owin Cookie Saver:github.com/Sustainsys/owin-cookie-saver
通过对 CookieSecureOption 使用 Never 选项解决
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieSecure = CookieSecureOption.Never
})