域不可用时使用NegotiateStream

时间:2010-09-17 19:44:35

标签: c# dns windows-authentication offline

我正在使用NegotiateStream来验证客户端/服务器应用程序。服务器端代码如下所示:

SecureStream = new NegotiateStream(Stream, true);

SecureStream.AuthenticateAsServer(
    CredentialCache.DefaultNetworkCredentials,
    ProtectionLevel.EncryptAndSign,
    TokenImpersonationLevel.Identification);

if (!SecureStream.IsAuthenticated)
{
    return false;
}
WindowsPrincipal principal = new WindowsPrincipal(
    (WindowsIdentity)SecureStream.RemoteIdentity);

// ExpectedRoles is a string[] of possible roles
foreach (string role in ExpectedRoles)
{
    if (principal.IsInRole(role))
        return true;
}

客户端代码如下所示:

SecureStream = new NegotiateStream(Stream, true);
SecureStream.AuthenticateAsClient();
if (!SecureStream.IsAuthenticated)
{
    return false;
}

客户端和服务器可以在同一域的不同网段上运行。因此,如果它们位于与域控制器不同的段上,并且互联网连接断开,则它们应该能够以离线方式运行。问题是,某些域已配置,因此用户无法在域断开模式下进行身份验证(显然关闭该功能是一种安全措施)。

因此,我正在尝试找出一种身份验证模型,该模型允许我在域名不可用时将非域用户身份验证为后备位置。

1 个答案:

答案 0 :(得分:1)

Kerberos(以及较小程度的NTLM)非常容忍服务器和DC之间的瞬时网络中断。一旦用户获得了服务器的有效Curb票证,即使服务器(或客户端)无法联系DC,服务器也将继续对用户进行身份验证。此类故障单的默认生命周期为10小时,通常包括在日常工作日暂时中断的人员。

NTLM会话的缓存时间更长,比如15分钟(最后我检查过这个问题,这是4 - 5年前),因此短暂停电必须比“一小时或三小时”更短暂。

客户端(或服务器)与DC之间的预期中断时间是多少? [旁白:如果它真的不好,为什么不调查在有损网段的近端丢弃低功率DC(即使是只读拷贝,如果你正在运行2008 AD)? ]

相关问题