protected override async Task <AuthenticationTicket> AuthenticateCoreAsync()
        {
            ClientCertificateValidationResult validationResult = await Task.Run(() => ValidateCertificate(Request.Environment));

            if (validationResult.CertificateValid)
            {
                AuthenticationProperties authProperties = new AuthenticationProperties
                {
                    IssuedUtc    = DateTime.UtcNow,
                    ExpiresUtc   = DateTime.UtcNow.AddDays(1),
                    AllowRefresh = true,
                    IsPersistent = true
                };
                IList <Claim> claimCollection = new List <Claim>
                {
                    new Claim(ClaimTypes.Name, "Andras")
                    , new Claim(ClaimTypes.Country, "Sweden")
                    , new Claim(ClaimTypes.Gender, "M")
                    , new Claim(ClaimTypes.Surname, "Nemes")
                    , new Claim(ClaimTypes.Email, "*****@*****.**")
                    , new Claim(ClaimTypes.Role, "IT")
                    , new Claim("HasValidClientCertificate", "true")
                };
                ClaimsIdentity       claimsIdentity = new ClaimsIdentity(claimCollection, "X.509");
                AuthenticationTicket ticket         = new AuthenticationTicket(claimsIdentity, authProperties);
                return(ticket);
            }
            return(await Task.FromResult <AuthenticationTicket>(null));
        }
        private ClientCertificateValidationResult ValidateCertificate(IDictionary <string, object> owinEnvironment)
        {
            if (owinEnvironment.ContainsKey(_owinClientCertKey))
            {
                X509Certificate2 clientCert = Context.Get <X509Certificate2>(_owinClientCertKey);
                return(_clientCertificateValidator.Validate(clientCert));
            }

            ClientCertificateValidationResult invalid = new ClientCertificateValidationResult(false);

            invalid.AddValidationException("There's no client certificate attached to the request.");
            return(invalid);
        }