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; }