最高可达.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重定向到登录页面,并且无法获取用户名。
有人解决了这个问题吗?
答案 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
。)