我们正在开发一个ASP.Net MVC内部网样式应用程序,并试图利用Windows身份验证,因为绝大多数用户都是内部的,并且已经过预先验证到本地域。
身份验证以相当标准的方式实现,但我们选择存储在数据库中的角色信息除外。我们已经以两种不同的方式实现了这一点(自定义RoleProvider和覆盖Context.User-- IsInRole),这两种方式都满足要求,并且在IIS Express和本地IIS服务器上托管的开发环境中都没有问题。
问题是,一旦我们将应用程序移动到暂存环境,该环境仍然在同一本地网络/统治中,两种身份验证方法都不起作用。这两种方法似乎都被忽略了,Windows身份验证角色提供程序接管了。
为了证明这一点,我在Home / Index页面中有一大块代码,除了User.IsInRole(" Users")之外,它还列举了Windows域组并测试了每个组的User.IsInRole。 (自定义角色)。在开发环境下,每个Windows组都返回false,而自定义角色返回true。在分期环境下,情况正好相反。
我对达到预期结果的方法感到满意,所以我想到了为什么以下任何一种方法都无效的原因。
自定义角色提供程序未生效
Global.asax" Application_AuthenticateRequest"事件永远不会触发,因此不使用具有重写的IsInRole方法的自定义User对象。
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (Context.User != null)
Context.User = new UserPrincipal(Context.User.Identity);
}
Server 2008,IIS 7,MVC 5.1
提前谢谢。
答案 0 :(得分:0)
问题是我遵循建议从我的应用程序的web.config的modules部分删除runAllManagedModulesForAllRequests =“true”,但这导致相关的应用程序事件停止触发(因为模块未注册)。
请参阅此处的文章,以及评论中有关此问题的更多信息。 http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html
替换runAllManagedModulesForAllRequests =“true”属性现在解决了这个问题,但是我正在尝试安装提供的MS提供的修补程序,以消除对此和/或手动注册的模块的依赖。