民间, 我有一个ASP.NET MVC应用程序,我试图使用ADFS v2.0(日内瓦)的Release Candidate版本来保护。我已将应用程序配置为依赖方信任,并且我已使用Fedutil.exe修改应用程序的Web.config,以便它具有有关Geneva服务器的信息并使用Geneva服务器作为其声明源。
然而,当我尝试点击MVC应用程序时,它会重定向到日内瓦,然后(在警告我有关自签名证书后)再次将我重新引导到MVC应用程序。在接受两个自签名证书警告后,两个服务器在无限重定向循环中互相打乒乓,直到最后日内瓦发出以下消息:
同一个客户端浏览器会话在最后'1'秒内发出'6'请求。可能存在可能的错误配置。有关详细信息,请与您的管理员联系。
除了包含上述消息的事件外,MVC端或日内瓦的事件日志中没有错误。如果有人能给我一些关于如何尝试和调试,诊断并希望解决这个问题的信息,我会永远感激。
同样,日内瓦盒子是ADFS v2.0 Release Candidate,ASP.NET MVC站点是使用最新的(09年末)版本的Windows Identity Foundation SDK构建的,其中Web.config使用FedUtil.exe修改而来。 WIF SDK。
所以你们都会得到这个......我在Firefox上尝试过这个相同的应用程序...... IT工作。我收到提示输入我的域凭据,ADFS v2服务器重新指示我ONCE然后我最终在我的应用程序的主页上,完成我的帐户名称和个性化问候语。 所以现在真正的问题是:为什么IE8会陷入无限重定向循环并且Firefox不是? 经过进一步测试,我已经能够开箱即用,无需修改ADFS v2(RC)或BOTH Safari和Firefox上的WIF(RTW)中的任何默认管道内容。 IE8是唯一一个在处理此身份验证方案时遇到任何问题的浏览器。我已经尝试了所有方法,包括安装和信任自签名证书,将站点添加到我的本地Intranet区域,并将安全性降低到低,甚至设置第一个和第三方cookie以便始终允许。
答案 0 :(得分:13)
我在ADFS 1.0上遇到了同样的问题 为了解决这个问题,我确保URL有一个前导斜杠“/”,它总是可以在FireFox和IE中使用
答案 1 :(得分:7)
原来,依赖方的主机名中有一个下划线(khoffman_2)。显然,下划线是非法的DNS字符,只有IE会拒绝其中带有下划线的信息。
我将我的机器从khoffman_2重命名为khoffman2,ADFS v2 / MVC依赖方组合在Firefox,Safari和IE上完美运行。
答案 2 :(得分:1)
虽然这不是您的问题,但我们遇到的问题与您所描述的完全相同。我们的解决方案是:
答案 3 :(得分:0)
Jaxidian的答案很接近。
在我的情况下,我只需要:
Windows身份验证 - >停用
Anonymous Auth - >启用
ASP.NET模拟 - >停用
表单验证 - >停用
Windows身份验证 - >停用
答案 4 :(得分:0)
当用户未被授权访问页面时,可能会发生此循环。
我们的MVC控制器上有一个自定义授权属性,如果配置文件中的UseADFS设置为true,则会根据提供的声明检查用户是否处于角色中。我认为这个设置设置为true,并且在访问页面时我一直得到adfs循环感到困惑,因为我在被授权访问页面的组中。
排除故障的关键是制作一个显示我的adfs声明的网页,而不需要进行身份验证。
@if (User.Identity.IsAuthenticated)
{
<div>UserName: @User.Identity.Name;</div>
var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
<table>
@foreach (var claim in claimsIdentity.Claims)
{
<tr><td>@claim.Type</td><td>@claim.Value</td></tr>
}
</table>
}
我注意到我登录ADFS,我的声明已经设置好,所以ADFS正在运行。实际问题是我的配置文件有UserADFS =&#34; true&#34;而不是UseADFS =&#34; true&#34;这基本上导致我的自定义授权代码在授权时返回false。因此,页面会将我转发回adfs以再次进行身份验证。
无论如何,如果用户没有正确的声明来访问该页面,那么也可以进行此adfs登录循环。
此外,如果您编写了自定义授权属性,请务必查看以下链接,该链接介绍了如何防止循环。
Redirect loop with .Net MVC Authorize attribute with ADFS Claims
来自该链接的AuthorizeAttribute的自定义HandleUnauthorizedRequest处理程序代码:
protected override void HandleUnauthorizedRequest System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
//One Strategy:
//filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
//Another Strategy:
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
controller = "u",
action = "LoginStatus",
errorMessage = "Error occurred during authorization or you do not have sufficient priviliges to view this page."
})
);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}