Может ли UserNamePasswordValidator генерировать что-либо, кроме MessageSecurityException? - PullRequest
5 голосов
/ 21 декабря 2011

У меня есть служба 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 приводит к множеству проблем, включая синхронизацию времени сервер / клиент ...), и поскольку третья сторона будет использовать эту службу, я хотелось бы быть максимально четким.

Ответы [ 3 ]

3 голосов
/ 22 декабря 2011

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

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

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

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

1 голос
/ 26 июля 2012

Из пользовательского средства проверки пароля вы можете вернуть 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"));
0 голосов
/ 25 января 2013

Бросить ошибку как 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"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...