Я использую 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;
}
Клиент и сервер могут работать в отдельных сегментах сети одного домена. Так что, если они находятся в другом сегменте, чем контроллер домена, и интернет-соединение обрывается, они должны иметь возможность работать в автономном режиме. Проблема в том, что некоторые домены настроены так, что пользователи не могут проходить аутентификацию в режиме отключения домена (очевидно, отключение этой функции является мерой безопасности).
Поэтому я пытаюсь выяснить модель аутентификации, которая позволит мне аутентифицировать пользователей, не являющихся доменами, в качестве запасной позиции, когда домен недоступен.