【问题标题】:Mixing Forms and Windows authentication in .Net 4.5在 .Net 4.5 中混合表单和 Windows 身份验证
【发布时间】:2013-12-04 14:41:35
【问题描述】:

这在 .Net4.0 和 IIS 7.5 之前都是可能的。

一般的想法是为 Intranet 站点启用匿名和表单身份验证,并在子目录中启用 Windows 身份验证和表单身份验证并关闭匿名。通过使用一些自定义代码禁用表单 401 => 302 重定向,您将能够获取用户的用户名和域。

如果您在谷歌上搜索解决方案,所有道路似乎都指向此博客/解决方案: http://mvolo.com/iis-70-twolevel-authentication-with-forms-authentication-and-windows-authentication/

但是,当升级到 .net 4.5 和 IIS8 时,它会中断,总是强制 302 重定向到登录页面,并且无法获取用户名。

有人解决了吗?

【问题讨论】:

    标签: c# asp.net .net authentication iis


    【解决方案1】:

    我制作了一个 MVC 5 解决方案,使它看起来像一个外部提供者,完整的源代码在这里:

    https://github.com/MohammadYounes/MVC5-MixedAuth

    我没有机会在 IIS 8 上对其进行测试,请尝试并告诉我。

    【讨论】:

    • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
    • 据我了解,用户必须输入他们的 Windows 用户名才能通过 Windows 进行身份验证,对吗?你不能自动做吗?
    • @Tuco 不,这是自动登录。
    • 应该使用什么 IIS 设置?
    【解决方案2】:

    根据我对此设置的测试(启用 Windows 身份验证和表单身份验证的 .NET 4.5 / IIS 7.5),以下条件

    (System.Web.HttpContext.Current.User.Identity is System.Security.Principal.WindowsIdentity)

    true(在用户通过 Windows auth 成功验证后),理论上可以用来确定解决此问题的方法。您没有发布任何代码,所以我不能确定您将如何解决您的问题。您是否正在创建自定义表单身份验证票证?

    现在看来,Windows 身份验证胜过 Forms 身份验证,Request.IsAuthenticated == true 甚至在代码创建 Forms 身份验证票证之前!非常烦人,当我的一位客户决定安装 .NET 4.5 时,这给他们带来了问题,因为他们通过混合 Windows 和表单身份验证已经工作了好几年。目前(直到补丁准备好,并且客户有时间测试和部署它)解决方案是删除 .NET 4.5 并重新安装 4.0。如果他们真的认为他们需要 4.5 来做某事,他们会使用 diff 机器。

    例如,您可以使用您自己的bool IsAuthenticated 版本创建一个自定义身份类,而不是仅仅依赖Request.IsAuthenticated(同样,您没有发布代码,所以我只能假设这就是您正在做的事情) .那么解决方案就是在这两个因素为true的情况下检查forms authentication ticket是否存在:

    System.Web.HttpContext.Current.Request.IsAuthenticated && (System.Web.HttpContext.Current.User.Identity is System.Security.Principal.WindowsIdentity)

    您不能再仅依赖Request.IsAuthenticated,因为从技术上讲,当用户通过 Windows auth 进行身份验证时,请求已经过身份验证。 (而以前,当混合 Windows 身份验证和表单身份验证时,Request.IsAuthenticated 在创建表单身份验证票证之前不是true。)

    【讨论】:

    • 有趣。我正在经历相反的事情。 Forms auth 胜过 win auth,所有对 win auth 下的页面的请求都会立即重定向到 forms 登录页面。但是,我的设置是 IIS8,而不是 7.5。我使用 IIS win auth 来检索用户 AD 用户名和域并手动进行表单登录。这样我就可以通过表单提供单点登录和手动登录。
    • 我也为 SSO 这样做。如果我可以配置系统以避免在 Windows 身份验证之后(以及在表单身份验证之前)设置Request.IsAuthenticated=true,我可以避免做一个补丁(更改所有检查Request.IsAuthenticated 的代码以使用我自己的属性。)你会请愿意发布您的 web.config 吗?我在服务器 2012/iis8 中看到了相同的行为(在 Windows 身份验证成功后,请求被认为是经过身份验证的,但在表单身份验证之前,所以从 asp.net 的角度来看,“windows”是主要的身份验证方法而不是表单。但配置选项没有运气然而)。感谢您的信息。
    猜你喜欢
    • 2020-06-21
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2012-10-23
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多