在.Net 4.5中混合表单和Windows身份验证

时间:2013-12-04 14:41:36

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

最高可达.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重定向到登录页面,并且无法获取用户名。

有人解决了这个问题吗?

2 个答案:

答案 0 :(得分:7)

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

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

我没有机会在IIS 8上测试它,尝试并让我知道。

答案 1 :(得分:0)

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

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

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

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

例如,您可以使用自己的bool IsAuthenticated版本创建自定义标识类,而不是仅仅依赖于Request.IsAuthenticated(同样,您没有发布代码,所以我只能假设这是什么你在干嘛)然后,解决方案涉及在这两个因素为true的情况下检查表单身份验证票证是否存在:

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

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