【问题标题】:How can I convince Internet Explorer to allow authentication as another user?如何说服 Internet Explorer 允许以其他用户身份进行身份验证?
【发布时间】:2010-11-29 08:53:42
【问题描述】:

感谢您的阅读和您的想法;这是一个棘手的问题,所以我想分享一下,看看这对于比我们更有经验的开发人员来说是否真的是一个公平的挑战。

我们正在为企业 Microsoft Active Directory 环境开发一个 Web 应用程序,并且我们使用 IIS 提供的 Windows 身份验证来对用户进行身份验证以进行单点登录,以及表单身份验证。我知道 IIS 在两者都启用时会报错,但它工作得很好,而且我们部署的每个站点都没有奇怪的怪癖可以解决 - 直到现在。

新站点具有“共享”机器,使用通用帐户永久登录,该帐户对他们需要使用的应用程序具有只读访问权限。这意味着我们无法区分应该对应用程序具有不同权限的用户;我们需要某种方式来提示用户提供身份验证详细信息。

第一次尝试是认真的谷歌搜索;世界上似乎没有其他人有我们的问题,除了一些被误导的灵魂向以太提问但没有得到回应。

在对 IIS 身份验证的工作方式进行了一番头脑风暴和讨论之后,似乎最直接的解决问题的方法是发出401 Unauthorized 以响应已知为共享帐户的用户。这里的初步测试似乎卓有成效,在浏览器中成功更改了用户名,但是该站点的原型没有提示输入凭据,并且浏览器保留了相同的帐户详细信息。我们还点击了特定于 IE 的 javascript

document.execCommand("ClearAuthenticationCache")

同样,它在实验室工作,但不在现场工作。对现场 IE 安全设​​置的进一步实验表明,如果 webapp 站点被排除在 Intranet 区域之外,浏览器将自动重新进行身份验证,无论使用何种方法来欺骗浏览器提示用户输入新帐户详细信息。

现在我们陷入了困境。我们有一些解决方法可以让它按时运行,但它们绝对不是“正确”的答案:

  • 要求用户在登录我们的应用程序之前退出共享帐户 (...yuck)
  • 从所有机器上的 Intranet Zone 中排除我们的 webapp
  • 为用户提供非单点登录服务

我相信有一种规范的方法可以做到这一点 - 一种已知的模式,一个已经解决的常见基本问题,诸如此类 - 我很想知道有哪些创造性的方法可以解决这类问题,如果其他人真的经历过类似的事情。

【问题讨论】:

  • 在这些机器上提供第二个 IE 快捷方式是否合适,并打开“使用不同的凭据运行”选项? - 因此从该快捷方式启动将提示输入新凭据
  • 那么您是否考虑过使用其他浏览器?例如,FireFox 不知道 Single-Sing on 功能,但每次您第一次访问该页面时都会弹出一个登录输入表单...
  • @Yves M。我们在目标环境中非常受限;一切都相当官僚,微软工具包,甚至说服网站使用比 IE6 更新的浏览器版本也很困难。更改浏览器供应商不是一种选择:(
  • @Damien_The_Unbeliever 这是个好主意,该网站已经为我们设置了桌面快捷方式,并且为每个客户定制它可能很简单。谢谢!
  • 您提到了表单身份验证和 Windows 身份验证。用户何时会使用表单登录您的应用?

标签: c# iis-7 active-directory ldap windows-authentication


【解决方案1】:

我们最终确定了一个向服务器知道的 LDAP 目录提交查询的解决方案。这意味着必须接受用户的密码,但没有其他解决方案足以在生产环境中运行。

希望这对某人有所帮助。需要 .NET Framework 3.5+。

using System.DirectoryServices.AccountManagement;

private static bool IsLdapAuthenticated(string username, string password)
{
    PrincipalContext context;
    UserPrincipal principal;

    try
    {
        context = new PrincipalContext(ContextType.Domain);
        principal = Principal.FindByIdentity(context, IdentityType.SamAccountName, username) as UserPrincipal;
    }
    catch (Exception ex)
    {
        // handle server failure / user not found / etc
    }

    return context.ValidateCredentials(principal.UserPrincipalName, password);
}

【讨论】:

  • 我以前做过类似的事情。我还使用了 Windows 身份验证和表单身份验证。如果 Windows 身份验证不起作用,我们会重定向用户并回退到使用表单身份验证。我也遇到了与您现在面临的类似问题。我提供的解决方案是让表单身份验证页面提供两个登录选项。 “Windows 身份验证”和“指定另一个凭据。这不会强制用户始终输入密码。如果他喜欢使用他当前的登录凭据,我仍然允许他们这样做并将他重定向到 Windows 身份验证页面
【解决方案2】:

您能否创建一个拒绝共享帐户访问的页面。然后在需要用户使用非共享帐户重新进行身份验证的任何时候重定向到该页面,并在查询字符串中编码返回 URL?这应该会触发浏览器弹出通常的登录对话框。

用户重新验证后,新页面应该只是重定向回查询字符串中的返回 URL。

【讨论】:

  • 试过了;与 401 响应解决方案基本相同。因为服务器在到浏览器的 Intranet Zone 中,它会反复重传相同的凭据,直到达到预设的失败限制,然后在浏览器中显示 401 Unauthorized 页面。
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多