ASP.Net MVC 3登录和Windows身份验证
本文关键字:Windows 身份验证 登录 Net MVC ASP | 更新日期: 2023-09-27 18:16:49
我正在做一个ASP。Net MVC 3应用程序,我有一个用户表,存储用户名和他们的密码。我已经创建了一个额外的ADUsername(存储Active Directory的域/用户名)。
我正在尝试做以下事情:
-
从Intranet运行应用程序的用户不应该看到登录页面。他们的Domain/Username应该被自动接收,并与ADUsername字段进行比较。
-
用户运行应用程序从互联网(本地网络外)或用户没有ADUsername值:应该看到登录屏幕,他们应该使用我的自定义用户名和密码字段登录。
使用Visual Studio Development Server非常容易,但使用IIS非常困难:)
我设置我的网页。配置使用表单,我使用windowidentity . getcurrent()。名称以获取当前ADUsername,然后,我查找我的User表以查找用户和FormsAuthentication。SetAuthCookie他。
使用IIS总是返回appool 'ASP。. NET v4.0用户,没有反映我需要的域/用户。
帮忙吗?
这不是一项容易完成的任务。只有在启用IIS中的Windows身份验证,禁用匿名身份验证时,您才能使用内网用户的Windows身份。当用户的浏览器访问服务器时,IIS将执行NTLM质询/响应过程来验证用户。请注意,这个挑战/响应实际上发生在每个单独的HTTP请求中,而不仅仅是一次。
这个机制的问题是你的表单身份验证将不再被使用,因为它在Windows身份验证运行后启动,并且身份验证失败只会触发IIS拒绝访问-而不是回退到表单身份验证。
要构建一个混合型,你需要:
-
设置您的主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>
-
创建一个新的,单独的web应用程序,纯粹用于NTLM身份验证。它将授权然后重定向到主应用程序。对不起,这两个应用程序不能合并。
-
在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"]