【问题标题】:Forms Authentication: "The server could not be contacted"表单身份验证:“无法联系服务器”
【发布时间】:2014-08-01 14:05:57
【问题描述】:

我将以下内容添加到需要登录的应用程序的 web.config 中:

<authentication mode="Forms">
  <forms loginUrl="/forms/Login" name=".ASPXAUTH" timeout="60" slidingExpiration="true">
  </forms>
</authentication>
<authorization>
  <deny users="?" />
</authorization>

/forms/Login 是一个集中式应用程序,用于对同一服务器上的应用程序进行身份验证。 它有一个简单的 Authentication 类,方法如下:

    public static bool AuthenticateUser(String username, String password)
    {
        bool validated = false;
        PrincipalContext pc = new PrincipalContext(ContextType.Domain, "mynet.myad.org", "dc=mynet,dc=myad,dc=org");
        validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate);
        return validated;
    }

这在大多数情况下都很好用,但有时它似乎“锁定”并且会抛出以下异常:“无法联系服务器。”它将继续抛出该异常,直到我重新启动 Web 服务器或卸载/重新安装登录应用程序。 (我尝试过重启 IIS,但这对它没有影响)。

我相当肯定它不是 AD 服务器,因为相同的登录代码同时继续在其他 Web 服务器上工作。我显然不希望不得不不断地重新启动 Web 服务器或重新安装登录应用程序。

我真的不知道从哪里开始解决这个问题。 对此的任何帮助将不胜感激!

【问题讨论】:

    标签: c# asp.net active-directory iis-7.5 forms-authentication


    【解决方案1】:

    我假设您在域中有多个域控制器?如果是这样,听起来其中之一可能是您的罪魁祸首。我的建议是,下次发生这种情况时,您从受影响的服务器收集网络跟踪并重现问题。如果存在 DNS 或连接问题,我不会感到惊讶。

    【讨论】:

    • 我们确实有多个域控制器。网络服务器是否会在同一时间失败后每次都继续访问同一个服务器?您建议将什么用于网络跟踪。谢谢!
    • Windows 缓存查找 - 您可以查找 DsGetDcName API 和 DC Locator 以了解所有细节。我不完全知道 PrincipalContext 类是如何在这里工作的 - S.DS.AD 抽象了很多东西。如果您想添加一些可靠性/重试,您可以使用 S.DS.AD 的域控制器类自己进行发现并传递标志以强制查找,然后将结果传递给 PrincipalContext。就网络跟踪、NetMon 或 Wireshark 而言,Netmon 更易于阅读,因为它允许您按进程进行过滤。
    • 谢谢,下次出现时我会试试看的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多