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

本文关键字:Windows 身份验证 登录 Net MVC ASP | 更新日期: 2023-09-27 18:16:49

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

我正在尝试做以下事情:

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

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

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

我设置我的网页。配置使用表单,我使用windowidentity . getcurrent()。名称以获取当前ADUsername,然后,我查找我的User表以查找用户和FormsAuthentication。SetAuthCookie他。

使用IIS总是返回appool 'ASP。. NET v4.0用户,没有反映我需要的域/用户。

帮忙吗?

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

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

这个机制的问题是你的表单身份验证将不再被使用,因为它在Windows身份验证运行后启动,并且身份验证失败只会触发IIS拒绝访问-而不是回退到表单身份验证。

要构建一个混合型,你需要:

  1. 设置您的主web应用程序,以表单身份验证用户。设置网络。像这样配置。生成您自己的机器密钥-这是确保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应用中,更改web。配置如下认证模式:

    <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>
  • 在NTLM webapp中,控制器做一件事-从(windowsprprincipal)Thread.CurrentPrincipal()中提取用户名;并调用FormsAuthentication.SetAuthCookie(..)。然后重定向到主web应用程序。不要使用windowidentity . getcurrent(),因为如果没有启用模拟,它将不准确[见msdn.microsoft.com/en-us/library/ff647076.aspx],你不想使用

  • 你不能在Cassini或IIS Express下测试这些;您必须使用IIS 7.5。

  • 转到IIS 7.5并打开"身份验证-匿名"answers"身份验证- Windows"的功能委托。

  • 为你的基于表单的应用创建IIS应用

  • 右键单击新创建的表单应用程序并"添加应用程序"。设置NTLM身份验证应用程序的路径,并将名称设置为"IntranetAuthentication"

  • 在浏览器中访问http://localhost/YourSite进行表单认证,和http://localhost/YourSite/IntranetAuthentication查看NTLM认证然后passthru认证返回到主站点

  • 在贵公司,指导内网用户使用内网登录。外部每个人都使用常规表单认证页面

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

      context.Request.ServerVariables["LOGON_USER"]