我正在更新一个使用表单身份验证的旧 ASP .NET 3.5 webforms 应用程序。要求它需要自动登录经过身份验证的域用户,同时仍允许外部用户像以前一样手动登录。
要清楚:如果当前登录的用户与服务器位于同一域中,我需要找出他们的名字,并使用此信息绕过旧的登录系统。并非所有用户都会在网络上。
我遇到的问题是,虽然我可以从.NET 中获取登录用户请求.LogonUserIdentity,我必须在相关页面上禁用匿名访问,然后它才能正常工作。 发生的情况是,任何未被识别的人都会收到登录提示以登录域,但我不希望出现这种情况,因为有些用户在域内没有用户帐户。
我能想到的唯一解决方案是为域用户提供一个自动重定向的特殊登录页面。但如果他们可以直接访问任何页面就更好了。
该网站在带有 IIS 6.0 的 Windows Server 2003 R2 上运行。
谢谢。
答案1
简短的回答是“否”。除非您专门启用了 Windows 身份验证(并禁用了所有其他身份验证方法),否则用户将无法针对域或本地计算机进行身份验证……并且您无法以编程方式访问此信息。
长答案也是否定的。如果同时启用了匿名身份验证,则匿名身份验证将覆盖 Windows 身份验证... 如果启用了匿名身份验证,IIS 将跳过其他身份验证方法。如果启用了 Windows 身份验证(禁用了任何匿名身份验证),IIS 将发送 Kerberos/NTLM 质询,然后(在提示后)浏览器才会发送凭据。如果在 Intranet 区域内,Internet Explorer 将在不提示的情况下发送 Kerberos 信息。-Chris
答案2
该解决方案可能不可用于 OOTB(开箱即用)。
我们的环境中有 SharePoint 2010,当通过 IE 打开时,它不会要求输入凭据。所有其他位置每次访问时都会要求输入域用户名和密码。我相信如果有任何解决方案,MS 会为 SharePoint 提供解决方案,因为这个提示非常烦人。
之前,一个项目有类似的需求,后来被转移到表单身份验证(基于修订的业务规则)。现在,我预计在不久的将来会遇到类似的需求,而且自过去几天以来,我还没有看到任何针对此需求的工作示例。
除了要求用户使用 IE(用于此内容)之外,我想到的直接解决方案是使用浏览器插件与活动目录进行通信并在后端处理此问题。不幸的是,即使有效,大多数面临此问题的开发人员(包括我)也不可能选择这样做。
答案3
我也一直在研究这个问题,绞尽脑汁想如何让它工作,最后终于弄明白了。所以我想我会把我的方法告诉大家。虽然不是很简洁,但可以工作。这个过程可以应用于其他页面和创建页面的方法。
我使用 PHP 创建了一个带有登录表单的页面。它使用 LDAPS 连接来验证用户。这工作得很好。然后我想大胆一点并改变它,这样已经在域中的人就不必登录了。通过读取 $_SERVER['REMOTE_USER'] 凭据字段,这工作得很好,但需要我打开 Windows 身份验证。这很好,但它完全忽略了我的登录表单,并且有一些用户是调试和测试用户和承包商,我们不想将他们添加到 AD 中,因此他们被保存在 MySQL 数据库中。没有登录表单,他们就无法登录!!此外,如果用户使用 Firefox,它无论如何都不会传递 $_SERVER['REMOTE_USER'] 凭据。
为了修复登录页面,我复制了该页面,并在其后添加了 _SSO(单点登录)。所以现在我的应用程序是“www.mywebsite.com/testapp”,将是“www.mywebsite.com/testapp_sso/”。一个将使用 Windows 身份验证,一个将使用匿名登录。然后,我使用 IIS7 URL 重写,因此当他们访问 testapp 时,他们的 IP 地址(即 $_SERVER['REMOTE_HOST'])在我们的子网内,它会将 URL 重写到 _SSO 文件夹。
下一步,您还可以为“firefox”_SERVER["HTTP_USER_AGENT"] 添加另一个 URL 重定向规则。这样一来,即使处于 IP 范围内,每个人也都会被迫转到非 _SSO 页面。因此,即使他们在我们的网络上,Firefox 用户仍然会看到其他人都能看到的旧登录页面,而不是可怕的 Windows 身份验证弹出窗口。
最后一步是添加 URL 屏蔽,这样用户就不知道他们在 testapp_SSO 还是 testapp 上。
对于用户端来说,这就是全部了。但是现在每次你想更新一个页面时,你也必须将其复制到 _SSO 文件夹。你可以使用一些同步软件创建同步,但你也可以创建硬符号链接!权限将在两个文件夹之间起作用,你只需更新一个即可。
是的,如果这是 Linux,那就简单多了。但这里我们必须使用 IIS。