private bool VerifySecurity(ClientInfo client)
{
if ((object)client == null)
throw new ArgumentNullException(nameof(client));
// Set current thread principal to remote client's user principal.
if (!(Thread.CurrentPrincipal is WindowsPrincipal) && (object)client.ClientUser != null)
Thread.CurrentPrincipal = client.ClientUser;
// Retrieve previously initialized security provider of the remote client's user.
SecurityProviderCache.ValidateCurrentProvider();
// Initialize security provider for the remote client's user from specified credentials.
if ((!Thread.CurrentPrincipal.Identity.IsAuthenticated || (object)client.ClientUser == null) && !string.IsNullOrEmpty(client.ClientUserCredentials))
{
string[] credentialParts = client.ClientUserCredentials.Split(':');
if (credentialParts.Length == 2)
{
ISecurityProvider provider = SecurityProviderUtility.CreateProvider(credentialParts[0]);
if (provider.Authenticate(credentialParts[1]))
SecurityProviderCache.CurrentProvider = provider;
}
}
// Save the initialized security provider of remote client's user for subsequent uses.
if (client.ClientUser != Thread.CurrentPrincipal)
client.SetClientUser(Thread.CurrentPrincipal);
return (object)client.ClientUser != null && client.ClientUser.Identity.IsAuthenticated;
}