protected override async Task <AuthenticateResult> HandleAuthenticateAsync()
        {
            try
            {
                if (!Request.Headers.ContainsKey("Authorization"))
                {
                    return(AuthenticateResult.NoResult());
                }

                if (!AuthenticationHeaderValue.TryParse(Request.Headers["Authorization"],
                                                        out AuthenticationHeaderValue headerValue))
                {
                    return(AuthenticateResult.NoResult());
                }

                if (!Enums.AuthenticationSchemes.Basic.Equals(headerValue.Scheme, StringComparison.OrdinalIgnoreCase))
                {
                    return(AuthenticateResult.NoResult());
                }

                byte[]   headerValueBytes = Convert.FromBase64String(headerValue.Parameter);
                string   userAndPassword  = Encoding.UTF8.GetString(headerValueBytes);
                string[] parts            = userAndPassword.Split(':', StringSplitOptions.RemoveEmptyEntries);
                if (parts.Length != 2)
                {
                    return(AuthenticateResult.Fail("Invalid Basic authentication header"));
                }

                var authParams = new Models.AuthenticationParameters
                {
                    Login    = parts[0],
                    Password = parts[1]
                };

                var user = await _authenticationService.Authentication(Options, authParams);

                if (user != null)
                {
                    var claims    = new[] { new Claim(ClaimTypes.Name, user.Login), new Claim(ClaimTypes.Role, user.Role) };
                    var identity  = new ClaimsIdentity(claims, Scheme.Name);
                    var principal = new ClaimsPrincipal(identity);
                    var ticket    = new AuthenticationTicket(principal, Scheme.Name);
                    return(AuthenticateResult.Success(ticket));
                }

                return(AuthenticateResult.Fail("Invalid login or password"));
            }
            catch (Exception e)
            {
                return(AuthenticateResult.Fail(e.Message));
            }
        }
        protected override async Task <AuthenticateResult> HandleAuthenticateAsync()
        {
            try
            {
                if (!Request.Headers.ContainsKey("Authorization"))
                {
                    return(AuthenticateResult.NoResult());
                }

                if (!AuthenticationHeaderValue.TryParse(Request.Headers["Authorization"],
                                                        out AuthenticationHeaderValue headerValue))
                {
                    return(AuthenticateResult.NoResult());
                }

                if (!Enums.AuthenticationSchemes.HMAC.Equals(headerValue.Scheme, StringComparison.OrdinalIgnoreCase))
                {
                    return(AuthenticateResult.NoResult());
                }

                string[] parts = headerValue.Parameter.Split(':', StringSplitOptions.RemoveEmptyEntries);
                if (parts.Length != 3)
                {
                    return(AuthenticateResult.Fail("Invalid HMAC authentication header"));
                }

                var authParams = new Models.AuthenticationParameters
                {
                    Login     = parts[0],
                    Hash      = parts[1],
                    TimeStamp = parts[2]
                };

                var user = await _authenticationService.Authentication(Options, authParams);

                if (user != null)
                {
                    var claims    = new[] { new Claim(ClaimTypes.Name, user.Login), new Claim(ClaimTypes.Role, user.Role) };
                    var identity  = new ClaimsIdentity(claims, Scheme.Name);
                    var principal = new ClaimsPrincipal(identity);
                    var ticket    = new AuthenticationTicket(principal, Scheme.Name);
                    return(AuthenticateResult.Success(ticket));
                }

                return(AuthenticateResult.Fail("Failed authentication"));
            }
            catch (Exception e)
            {
                return(AuthenticateResult.Fail(e.Message));
            }
        }
        protected override async Task <AuthenticateResult> HandleAuthenticateAsync()
        {
            try
            {
                if (!Request.Headers.ContainsKey("Authorization"))
                {
                    return(AuthenticateResult.NoResult());
                }

                if (!AuthenticationHeaderValue.TryParse(Request.Headers["Authorization"],
                                                        out AuthenticationHeaderValue headerValue))
                {
                    return(AuthenticateResult.NoResult());
                }

                if (!Enums.AuthenticationSchemes.Bearer.Equals(headerValue.Scheme, StringComparison.OrdinalIgnoreCase) || string.IsNullOrWhiteSpace(headerValue.Parameter))
                {
                    return(AuthenticateResult.NoResult());
                }

                var authParams = new Models.AuthenticationParameters
                {
                    Token = headerValue.Parameter
                };

                var user = await _authenticationService.Authentication(Options, authParams);

                if (user != null)
                {
                    var claims    = new[] { new Claim(ClaimTypes.Name, user.Login), new Claim(ClaimTypes.Role, user.Role) };
                    var identity  = new ClaimsIdentity(claims, Scheme.Name);
                    var principal = new ClaimsPrincipal(identity);
                    var ticket    = new AuthenticationTicket(principal, Scheme.Name);
                    return(AuthenticateResult.Success(ticket));
                }

                return(AuthenticateResult.Fail("Failed authentication"));
            }
            catch (Exception e)
            {
                return(AuthenticateResult.Fail(e.Message));
            }
        }