Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何说服Internet Explorer允许作为另一个用户进行身份验证?_C#_Iis 7_Active Directory_Ldap_Windows Authentication - Fatal编程技术网

C# 如何说服Internet Explorer允许作为另一个用户进行身份验证?

C# 如何说服Internet Explorer允许作为另一个用户进行身份验证?,c#,iis-7,active-directory,ldap,windows-authentication,C#,Iis 7,Active Directory,Ldap,Windows Authentication,感谢您的阅读和思考;这是一个令人毛骨悚然的问题,所以我想我会和大家分享一下,看看这对比我们经验丰富的开发人员来说是否真的是一个公平的挑战 我们正在为公司的Microsoft Active Directory环境开发一个web应用程序,我们使用IIS提供的Windows身份验证以及表单身份验证对用户进行单次登录身份验证。我知道当两个都启用时,IIS会抱怨,但它工作得非常好,而且我们部署的每个站点都没有奇怪的怪癖需要解决——直到现在 新站点拥有“共享”机器,使用通用帐户永久登录,该帐户对需要使用的应

感谢您的阅读和思考;这是一个令人毛骨悚然的问题,所以我想我会和大家分享一下,看看这对比我们经验丰富的开发人员来说是否真的是一个公平的挑战

我们正在为公司的Microsoft Active Directory环境开发一个web应用程序,我们使用IIS提供的Windows身份验证以及表单身份验证对用户进行单次登录身份验证。我知道当两个都启用时,IIS会抱怨,但它工作得非常好,而且我们部署的每个站点都没有奇怪的怪癖需要解决——直到现在

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

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

在对IIS的身份验证工作方式进行了一些头脑风暴和详细分析之后,似乎解决问题的最直接方法是向已知为共享帐户的用户发出
401 Unauthorized
。这里的初始测试似乎很有成效,成功地更改了浏览器中的用户名,但是网站上的原型没有提示提供凭据,浏览器保留了相同的帐户详细信息。我们还讨论了IE特定的javascript

document.execCommand("ClearAuthenticationCache")
同样,这在实验室中起作用,但不是在现场。现场IE安全设置的进一步实验表明,如果webapp站点被排除在Intranet区域之外,浏览器将自动重新验证,而不管使用何种方法诱使浏览器提示用户输入新帐户详细信息

现在我们被卡住了。我们有一些解决方案可以让它按时进行,但它们肯定不是“正确”的答案:

  • 要求用户在登录我们的应用程序之前注销共享帐户(…恶心)
  • 将我们的webapp从所有计算机上的Intranet区域中排除
  • 为用户提供非SSO登录服务

我确信有一种规范的方法可以做到这一点——一种已知的模式,一个已经解决的常见基本问题,诸如此类的东西——我很想知道有什么样的发明方法可以解决这类问题,如果其他人真的有过类似的远程体验。

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


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

我们最终找到了一个解决方案,将查询提交到服务器知道的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);
}

在这些机器上,打开“使用不同凭据运行”选项,只提供IE的第二个快捷方式是否合适因此,从该快捷方式启动将提示输入新的证书。您是否考虑过使用其他浏览器?例如,FireFox不知道Sing-on功能,但每次您第一次访问页面时都会弹出一个登录输入表单…@Yves M。我们在目标环境中受到很大限制;一切都相当官僚化,微软工具包,甚至说服网站使用比IE6更新的浏览器版本都很困难。更改浏览器供应商不是一个选项:(@Damien_The_unsiver这是个好主意,该网站已经为我们设置了一个桌面快捷方式,每个客户端定制它可能很简单。谢谢!你提到了窗体身份验证和Windows身份验证。用户何时使用窗体登录你的应用程序?尝试过了;基本上与401响应解决方案相同。Bec由于服务器位于浏览器的Intranet区域,它将重复重新传输相同的凭据,直到达到预设的失败限制,然后在浏览器中显示401个未经授权的页面。我以前也做过类似的事情。我还使用了Windows身份验证和表单身份验证。如果Windows身份验证不起作用,我们重定向用户并返回使用表单身份验证。我也遇到了与您现在面临的问题类似的问题。我提供的解决方案是让表单身份验证页面提供两个登录选项。“Windows身份验证”和指定其他凭据。这不会强制用户始终键入密码。如果他喜欢使用当前登录凭据,我仍然允许他们这样做,并将其重定向到Windows身份验证页