ASP.Net MVC 3登录和Windows身份validation

我正在开发一个ASP.Net MVC 3应用程序,我有一个用户表来存储用户名和密码。 我创建了一个额外的ADUsername(存储Active Directory的域/用户名)。

我正在尝试执行以下操作:

  1. 从Intranet运行应用程序的用户不应该看到登录页面。 应自动接收其域/用户名,并与ADUsername字段进行比较。

  2. 从Internet(本地网络外)或没有ADUsername值的用户运行应用程序的用户应该看到登录屏幕,他们应该使用我的自定义用户名和密码字段登录。

使用Visual Studio开发服务器非常容易,使用IIS非常困难:)

当我将Web.Config设置为使用表单时,我使用WindowsIdentity.GetCurrent()。Name来获取当前的ADUsername,然后,我查找我的User表以查找用户和FormsAuthentication.SetAuthCookie他。

使用IIS总是返回APPPOOL \ ASP.NET v4.0用户,这不反映我需要的域/用户。

任何帮助?

这不是一件容易完成的任务。 只有在启用IIS中的Windows身份validation,禁用匿名身份validation时,才能使用Intranet用户的Windows身份。 当用户的浏览器访问服务器时,IIS将执行NTLM质询/响应过程以validation用户。 请注意,此质询/响应实际上发生在每个单独的HTTP请求上,而不仅仅是一次。

此机制的问题在于,您的Forms身份validation将不再使用,因为它在Windows身份validation运行后启动,并且无法进行身份validation只会触发IIS访问被拒绝 – 而不是回退到Forms身份validation。

要构建混合体,您需要:

  1. 设置主Web应用程序以使用Forms身份validation对用户进行身份validation。 像这样设置web.config。 生成您自己的机器密钥 – 这是确保cookie共享工作的关键

              
  2. 创建一个新的独立Web应用程序,仅用于NTLM身份validation。 它将授权然后重定向到主应用程序。 抱歉,这两个应用无法合并。

  3. 在NTLM Web应用程序中,更改web.config身份validation模式,如下所示:

      ....           
  1. 在NTLM webapp中,控制器做了一件事 – 从(WindowsPrincipal)Thread.CurrentPrincipal()中提取用户名; 并调用FormsAuthentication.SetAuthCookie(..)。 然后重定向到主Web应用程序。 不要使用WindowsIdentity.GetCurrent(),因为如果没有启用模拟,它将不准确[请参阅msdn.microsoft.com/en-us/library/ff647076.aspx]您不想使用它

  2. 您无法在Cassini或IIS Express下测试任何此类内容; 您必须使用IIS 7.5。

  3. 转到IIS 7.5并为“身份validation – 匿名”和“身份validation – Windows”启用function委派。

  4. 为基于Forms的应用程序创建IIS应用程序

  5. 右键单击新创建的Forms应用程序和“添加应用程序”。 设置NTLM身份validation应用程序的路径,并将名称设置为“IntranetAuthentication”

  6. 在浏览器访问http:// localhost / YourSite进行表单身份validation, http:// localhost / YourSite / IntranetAuthentication查看NTLM auth然后passthru auth返回主站点

在您的公司,直接Intranet用户使用Intranet登录。 外部人员使用常规表单身份validation页面。

如果您使用混合身份validation,为什么不通过上下文获取AD用户?

  context.Request.ServerVariables["LOGON_USER"]