ADFS v2.0错误:MSIS7042:相同的客户端浏览器会话在最后'1'秒内发出'6'请求

时间:2010-04-14 18:34:50

标签: geneva-framework adfs2.0 geneva-server

民间,   我有一个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以便始终允许。

5 个答案:

答案 0 :(得分:13)

我在ADFS 1.0上遇到了同样的问题 为了解决这个问题,我确保URL有一个前导斜杠“/”,它总是可以在FireFox和IE中使用

例如:https://somedomain.com/Application_2/

答案 1 :(得分:7)

原来,依赖方的主机名中有一个下划线(khoffman_2)。显然,下划线是非法的DNS字符,只有IE会拒绝其中带有下划线的信息。

我将我的机器从khoffman_2重命名为khoffman2,ADFS v2 / MVC依赖方组合在Firefox,Safari和IE上完美运行。

答案 2 :(得分:1)

虽然这不是您的问题,但我们遇到的问题与您所描述的完全相同。我们的解决方案是:

  1. 在IIS中启用了基本身份验证(这只解决了后续两个步骤所需的内容)
  2. 在IIS中禁用Windows身份验证(这解决了某些IE浏览器但不是所有浏览器的问题)
  3. 在IIS中禁用匿名访问(这解决了其他IE浏览器的问题)

答案 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);
        }
    }