Может ли UserNamePasswordValidator выдать что-нибудь, кроме MessageSecurityException?

У меня есть служба WCF, подключенная к UserNamePasswordValidator через мой web.config, никаких проблем. В моем валидаторе я переопределяю Validate, проверяю учетные данные и при необходимости генерирую FaultException.

Пример:

public class CredentialValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        if (userName != "dummy")
        {
            throw new FaultException<AuthenticationFault>(new AuthenticationFault(), "Invalid credentials supplied");
        }
    }
}

Если я сам использую эту службу в приложении .NET и предоставляю недопустимые учетные данные, возникает исключение MessageSecurityException со следующим сообщением:

«От другой стороны была получена незащищенная или неправильно защищенная ошибка. Код ошибки и подробности см. Во внутреннем FaultException».

Я ожидал, что исключение FaultException - это InnerException в MessageSecurityException.

Есть ли способ, чтобы клиент получал только исключение FaultException?

MessageSecurityException не особо описывает истинную причину исключения (быстрый поиск по SO приводит к множеству проблем, включая синхронизацию времени сервера / клиента ..), и, поскольку сервис будет использовать третья сторона, я бы хотел быть максимально ясным.


person diggingforfire    schedule 21.12.2011    source источник


Ответы (3)


У меня была такая же проблема несколько месяцев назад, и после некоторого исследования я пришел к выводу, что вы можете выбросить все, что захотите, из кода валидатора, но клиент все равно получит исключение MessageSecurityException, которое вообще не содержит полезной информации.

Однако мы должны были сообщить клиенту, что на самом деле произошло - 1. неправильное имя пользователя / пароль 2. срок действия пароля истек, требуется изменение 3. некоторые другие пользовательские состояния, специфичные для приложения.

Таким образом, мы изменили логику CredentialValidator таким образом, что она выдает исключение только в случае 1. В других случаях это действительно позволяет вызывать настоящий метод WCF, но там мы также проверяем истечение срока действия пароля и т. Д., А в случае некоторых проблем бросаем FaultException уже из тела метода.

В нашем случае это сработало, потому что только служба с таким типом проверки была службой входа в систему, поэтому клиент всегда знал, почему именно он не был аутентифицирован.

person Maxim Zabolotskikh    schedule 21.12.2011
comment
Мне не нужно предоставлять клиенту информацию о деталях неудачной аутентификации, поэтому я думаю, что я просто продолжу выдавать ошибку faultexception из моего валидатора. - person diggingforfire; 26.12.2011

Из настраиваемого валидатора пароля вы можете вернуть FaultCode, описывающий, что не так:

throw new FaultException("Invalid user name or bad password.", new FaultCode("BadUserNameOrPassword"));

throw new FaultException("Password expired.", new FaultCode("PasswordExpired"));

throw new FaultException("Internal service error.", new FaultCode("InternalError"));
person Beat    schedule 26.07.2012
comment
При описанном выше подходе поведение таково, что исключение MessageSecurityException перехватывается, а InnerException является исключением FaultException с установленным сообщением и кодом FaultCode. - person Randy supports Monica; 17.12.2012

Вывести ошибку как MessageSecurityException с внутренним исключением как FaultException

public override void Validate(string userName, string password)
{
    var isValid = ValidateUser(userName, password);
    if (!isValid)
    {
        throw new MessageSecurityException("Userid or Password is invalid", new FaultException("Userid or Password is invalid"));
    }
}
person Balaji Gunasekaran    schedule 25.01.2013
comment
Это ИМЕННО то, что вы получите, если просто выбросите исключение Fault. OP хотел вернуть пользовательскую ошибку (например, Fault ‹AuthenticationFault›). - person Quarkly; 03.09.2013
comment
- DRAirey1 - чтобы это не сработало для него, выбросить новое исключение MessageSecurityException (неверный идентификатор пользователя или пароль, новая ошибка ‹AuthenticationFault› (неверный идентификатор пользователя или пароль)); - person Stix; 18.11.2015