我正在开发 ASP.Net MVC 3 应用程序,并且有一个存储用户名及其密码的用户表。我创建了一个额外的 ADUsername(存储 Active Directory 的域/用户名)。
我正在尝试执行以下操作:
从 Intranet 运行应用程序的用户不应看到登录页面。应自动接收其域名/用户名并与 ADUsername 字段进行比较。
从互联网(本地网络外)运行应用程序的用户或没有 ADUsername 值的用户:应该看到登录屏幕,并且他们应该使用我的自定义用户名和密码字段进行登录。
使用 Visual Studio Development Server 非常容易,使用 IIS 则非常困难:)
当我将 Web.Config 设置为使用表单时,我使用 WindowsIdentity.GetCurrent().Name 来获取当前的 ADUsername,然后查找用户表以找到用户和 FormsAuthentication.SetAuthCookie。
使用 IIS 总是返回 APPPOOL\ASP.NET v4.0 用户,这不反映我需要的域/用户。
有帮助吗?
这不是一件容易完成的任务。仅当启用 IIS 中的 Windows 身份验证并禁用匿名身份验证时,您才能使用 Intranet 用户的 Windows 身份。当用户的浏览器访问服务器时,IIS 将执行 NTLM 质询/响应过程来验证用户。请注意,此质询/响应实际上发生在每个单独的 HTTP 请求上,而不仅仅是一次。
此机制的问题在于,您的 Forms 身份验证将不再使用,因为它在 Windows 身份验证运行后启动,并且身份验证失败只会触发 IIS 访问被拒绝 - 而不是回退到 Forms 身份验证。
要构建混合动力,您需要:
-
设置您的主 Web 应用程序以使用表单身份验证对用户进行身份验证。像这样设置 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>
创建一个新的、单独的 Web 应用程序以纯粹用于 NTLM 身份验证。它将授权然后重定向到主应用程序。抱歉,这两个应用程序无法合并。
在 NTLM Web 应用程序中,更改 web.config 身份验证模式,如下所示:
<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 中,控制器做了一件事 - 从 (WindowsPrincipal)Thread.CurrentPrincipal() 中提取用户名;并调用 FormsAuthentication.SetAuthCookie(..)。然后重定向到主网络应用程序。不要使用 WindowsIdentity.GetCurrent(),因为如果不启用模拟 [请参阅 msdn.microsoft.com/en-us/library/ff647076.aspx],您不想使用它,它就不会准确
您无法在 Cassini 或 IIS Express 下测试任何这些;您必须使用 IIS 7.5。
转到 IIS 7.5 并打开“身份验证 - 匿名”和“身份验证 - Windows”的功能委派。
为基于表单的应用程序创建 IIS 应用程序
右键单击新创建的表单应用程序并选择“添加应用程序”。设置 NTLM 身份验证应用程序的路径,并将名称设置为“Intranet 身份验证”之类的名称
在浏览器访问中http://localhost/你的网站 http://localhost/YourSite用于表单身份验证,以及http://localhost/YourSite/IntranetAuthentication http://localhost/YourSite/IntranetAuthentication查看 NTLM 身份验证,然后通过身份验证返回主站点
在您的公司,引导 Intranet 用户使用 Intranet 登录。外部每个人都使用常规表单身份验证页面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)