public async Task <SignInValidationResult> ValidateAsync(SignInRequestMessage message, ClaimsPrincipal subject)
        {
            Logger.Info("Start WS-Federation signin request validation");
            var result = new SignInValidationResult();

            // parse whr
            if (!String.IsNullOrWhiteSpace(message.HomeRealm))
            {
                result.HomeRealm = message.HomeRealm;
            }

            // parse wfed
            if (!String.IsNullOrWhiteSpace(message.Federation))
            {
                result.Federation = message.Federation;
            }

            if (!String.IsNullOrWhiteSpace(message.GetParameter("login_hint")))
            {
                result.LoginHint = message.GetParameter("login_hint");
            }

            if (!subject.Identity.IsAuthenticated)
            {
                result.IsSignInRequired = true;
                return(result);
            }

            // check realm
            var rp = await _relyingParties.GetByRealmAsync(message.Realm);

            if (rp == null || rp.Enabled == false)
            {
                LogError("Relying party not found: " + message.Realm, result);

                return(new SignInValidationResult
                {
                    IsError = true,
                    Error = "invalid_relying_party"
                });
            }

            result.ReplyUrl             = rp.ReplyUrl;
            result.RelyingParty         = rp;
            result.SignInRequestMessage = message;
            result.Subject = subject;

            var customResult = await _customValidator.ValidateSignInRequestAsync(result);

            if (customResult.IsError)
            {
                LogError("Error in custom validation: " + customResult.Error, result);
                return(new SignInValidationResult
                {
                    IsError = true,
                    Error = customResult.Error,
                    ErrorMessage = customResult.ErrorMessage,
                });
            }

            LogSuccess(result);
            return(result);
        }
        public async Task<SignInValidationResult> ValidateAsync(SignInRequestMessage message, ClaimsPrincipal subject)
        {
            Logger.Info("Start WS-Federation signin request validation");
            var result = new SignInValidationResult();

            // parse whr
            if (!String.IsNullOrWhiteSpace(message.HomeRealm))
            {
                result.HomeRealm = message.HomeRealm;
            }

            // parse wfed
            if (!String.IsNullOrWhiteSpace(message.Federation))
            {
                result.Federation = message.Federation;
            }

            if (!String.IsNullOrWhiteSpace(message.GetParameter("login_hint")))
            {
                result.LoginHint = message.GetParameter("login_hint");
            }

            if (!subject.Identity.IsAuthenticated)
            {
                result.IsSignInRequired = true;
                return result;
            }

            // check realm
            var rp = await _relyingParties.GetByRealmAsync(message.Realm);

            if (rp == null || rp.Enabled == false)
            {
                LogError("Relying party not found: " + message.Realm, result);

                return new SignInValidationResult
                {
                    IsError = true,
                    Error = "invalid_relying_party"
                };
            }

            result.ReplyUrl = rp.ReplyUrl;
            result.RelyingParty = rp;
            result.SignInRequestMessage = message;
            result.Subject = subject;

            var customResult = await _customValidator.ValidateSignInRequestAsync(result);
            if (customResult.IsError)
            {
                LogError("Error in custom validation: " + customResult.Error, result);
                return new SignInValidationResult
                    {
                        IsError = true,
                        Error = customResult.Error,
                        ErrorMessage = customResult.ErrorMessage,
                    };
            }

            LogSuccess(result);
            return result;
        }