ASP.Net MVC 3登录和Windows身份验证

时间:2011-12-06 07:58:20

标签: c# asp.net asp.net-mvc asp.net-mvc-3

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

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

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

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

  3. 使用Visual Studio Development Server非常容易,使用IIS非常困难:)

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

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

    任何帮助?

2 个答案:

答案 0 :(得分:15)

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

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

要构建混合体,您需要:

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

    <authentication mode="Forms"><forms loginUrl="~/Account/LogOn" timeout="2880" path="/" enableCrossAppRedirects="true" name=".ASPXFORMSAUTH" protection="All"  />
    </authentication>
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" /> <system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication enabled="true"/>
        <windowsAuthentication enabled="false"/>
      </authentication>
    </security></system.webServer>
    
  2. 创建一个新的独立Web应用程序,仅用于NTLM身份验证。它将授权然后重定向到主应用程序。抱歉,这两个应用无法合并。

  3. 在NTLM网络应用中,更改web.config身份验证模式,如下所示:

  4.     <authentication mode="Windows">       
        </authentication>   
        <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
                    decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" />
    <system.webServer>
        ....
        <security>
          <authentication>
            <windowsAuthentication enabled="true"/>
            <anonymousAuthentication enabled="false"/>
          </authentication>
          <ipSecurity>
            <!-- put whatever here to restrict to your LAN
            <add ..../>
            -->
          </ipSecurity>
        </security>
      </system.webServer>
    
    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并启用“身份验证 - 匿名”和“身份验证 - Windows”功能委派。

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

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

    6. 在浏览器访问http://localhost/YourSite中进行表单身份验证,并http://localhost/YourSite/IntranetAuthentication查看NTLM身份验证,然后通过身份验证工作回到主站点

    7. 在您的公司,直接Intranet用户使用Intranet登录。在外部,每个人都使用常规表单身份验证页面。

答案 1 :(得分:3)

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

  context.Request.ServerVariables["LOGON_USER"] 
相关问题