6

伙计们,我有一个 ASP.NET MVC 应用程序,我正在尝试使用 ADFS v2.0(日内瓦)的候选发布版本来保护它。我已将应用程序配置为依赖方信任,并使用 Fedutil.exe 修改应用程序的 Web.config,以便它具有有关日内瓦服务器的信息并使用日内瓦服务器作为其声明源。

但是,当我尝试点击 MVC 应用程序时,它会重定向到日内瓦,然后(在警告我关于自签名证书之后)再次将我重定向到 MVC 应用程序。在接受两个自签名证书警告后,两台服务器在无限重定向循环中相互打乒乓球,直到日内瓦最终发出以下消息:

同一客户端浏览器会话在最后“1”秒内发出了“6”个请求。可能存在错误的配置。有关详细信息,请联系您的管理员。

除了包含上述消息的事件之外,MVC 端或日内瓦的事件日志中没有错误。如果有人能给我一些关于如何尝试和调试、诊断并希望解决这个问题的信息,我将永远感激不尽。

再次,日内瓦框是 ADFS v2.0 候选版本,ASP.NET MVC 站点是使用最新(09 年末)版本的 Windows Identity Foundation SDK 构建的,其中 Web.config 使用 WIF SDK 中的 FedUtil.exe 修改.


所以你们都会从中得到乐趣……我在 Firefox 中尝试了同样的应用程序,并且……它可以工作。系统提示我输入域凭据,ADFS v2 服务器将我重定向一次,然后我最终进入我的应用程序主页,并附有我的帐户名和个性化问候语。所以现在真正的问题是:为什么 IE8 会陷入无限重定向循环而 Firefox 不是?经过进一步的测试,我已经能够让这个场景开箱即用,无需修改来自 Safari 和 Firefox 上的 ADFS v2 (RC) 或 WIF (RTW) 的任何默认管道内容。IE8 是唯一一个在处理这种身份验证场景时出现任何问题的浏览器。我已经尝试了一切,包括安装和信任自签名证书,

4

5 回答 5

13

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

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

于 2010-10-13T00:38:57.680 回答
7

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

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

于 2010-04-19T18:07:00.787 回答
1

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

  1. 在 IIS 中启用基本身份验证(这没有解决任何问题,但在接下来的 2 个步骤中是必需的)
  2. 在 IIS 中禁用 Windows 身份验证(这解决了某些 IE 浏览器的问题,但不是全部)
  3. 在 IIS 中禁用匿名访问(这解决了其余 IE 浏览器的问题)
于 2011-06-06T20:20:47.017 回答
0

Jaxidian 的答案很接近。

就我而言,我只需要:

  • Windows 身份验证 -> 已禁用

  • 匿名身份验证 -> 已启用

  • ASP.NET 模拟 -> 已禁用

  • 表单验证 -> 已禁用

  • Windows 身份验证 -> 已禁用

于 2014-06-25T18:47:01.757 回答
0

当用户无权访问页面时,可能会发生此循环。

我们的 MVC 控制器上有一个自定义授权属性,如果在配置文件中 UseADFS 的设置为真,则根据提供的声明检查用户是否处于角色中。我认为此设置设置为 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="true" 而不是 UseADFS="true" 这基本上导致我的自定义授权代码在授权时返回 false。因此,该页面不断将我转发回 adfs 以再次进行身份验证。

无论如何,如果用户没有正确的声明来访问该页面,那么这个 adfs 登录循环也可能发生。

此外,如果您编写了自定义授权属性,请务必查看以下链接,该链接描述了如何防止循环。

带有 ADFS 声明的 .Net MVC 授权属性的重定向循环

来自该链接的 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);
        }
    }
于 2017-02-14T09:23:42.960 回答