Создание исключительной ситуации веб-службы XML для неверного имени пользователя / пароля - PullRequest
0 голосов
/ 09 августа 2009

Я создал веб-сервис и использую заголовок Soap для аутентификации, как описано здесь: http://aspalliance.com/805

Я адаптировал его так, что в каждом методе он вызывает отдельный метод «authenticate», который ищет имя пользователя и пароль в БД и возвращает true или false. Мой вопрос, в рамках этого метода, если он возвращает false (т. Е. Пользователь не проверен), как я должен выбросить исключение, которое фильтрует обратно в потребительское приложение?

Ответы [ 2 ]

1 голос
/ 09 августа 2009

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

Во-вторых, вы должны выбросить SOAPException. Это будет более или менее напрямую переведено в сбой SOAP. Ошибка SOAP - это подходящий способ указать на ошибку в операции веб-службы по той же причине, по которой исключения лучше, чем состояние возврата в обычном методе - вам не нужно проверять состояние возврата в точке вызова.

Наконец, знаете ли вы, что Microsoft объявила веб-службы ASMX «устаревшим» кодом, и что они больше не исправляют ошибки в нем? Пора переходить в WCF.

0 голосов
/ 21 сентября 2009

Я использовал исключения мыла для неудачных попыток входа в систему:

[WebMethod]
    [SoapHeader("authentication")]
    public User Authenticate()
    {
        try
        {
            authentication.Roles = new string[] { UserRoles.Users };
            ConfigureAuthentication();
            Service<ISecurity>.Interface.Authenticate();
            Guid userId = Service<ISecurity>.Interface.GetUserId(authentication.UserName);
            return Service<IObjectRetriever>.Interface.Retrieve<User>(userId);
        }
        catch (Exception ex)
        {
            WriteException(ex);
            throw new SoapException(ex.Message, new XmlQualifiedName(SoapException.ServerFaultCode.Name), ex);
        }
    }
...