Как обрабатывать исключения в пользовательской аутентификации WCF? - PullRequest
1 голос
/ 19 июня 2011

У меня есть служба WCF, настроенная на использование пользовательской проверки имени пользователя через переопределенный метод Validate () системы.IdentityModel.Selectors.UserNamePasswordValidator класс.

Когда проверка не проходит, я выбрасываю SecurityTokenValidationException.

Как это было построено, в моем клиенте я получаю CommuinicationException с сообщением: удаленный сервер вернул ошибку: NotFound.

Какой лучший способ справиться с этимисключение на стороне клиента?

Мой код проверки:

if (user == null || (Environment.TickCount - user.LastCall) > 300000)
{
    if (!LoginUser.ValidateUser(userName, password))
    {
        throw new SecurityTokenValidationException("Usuário/Senha inválido");
    }
}

Ответы [ 2 ]

3 голосов
/ 19 июня 2011

Создание исключения из службы (я полагаю) приведет к неисправности канала, и клиент получит неописательное сообщение.Это сделано специально - WCF «скрывает» исключения на стороне службы.

Чтобы вернуть клиенту ошибку, чтобы клиент мог ее обработать, следует использовать исключение FaultException.Вы можете указать FaultContract для операции, которая будет возвращена клиенту.

Выполните поиск по обработке ошибок в WCF, и вы должны получить множество примеров.У меня мало времени или я бы добавил немного, но, надеюсь, это укажет вам правильное направление.

Отредактировано, чтобы добавить

Изменить строку

throw new SecurityTokenValidationException("Usuário/Senha inválido");

до

throw new FaultException("Usuário/Senha inválido");

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

Это очень простое изменение, и пример должен проиллюстрировать это.Ссылки, которые я разместил ниже, предоставят более подробную информацию.

0 голосов
/ 19 июня 2011

Как вы определяете пользовательский объект, на котором вы проверяли последний вызов? Вы используете LINQ Single Call? если это так, то возникнет исключение, если пользователь не найден, и поэтому сервер прервет аутентификацию в этой точке, а не с исключением SecurityTokenValidationException, которое, я думаю, даст вам поведение, которое вы видите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...