Как получить сообщение об ошибке, возвращенное DotNetOpenAuth.OAuth2 с использованием Javascript - PullRequest
0 голосов
/ 07 декабря 2018

В моем собственном классе ApplicationOAuthProvider у меня есть это в методе GrantResourceOwnerCredentials:

        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "El nombre de usuario o la contraseña no son correctos.");
            context.Response.Headers.Add(ServerGlobalVariables.OwinChallengeFlag,
                    new[] { ((int)HttpStatusCode.Unauthorized).ToString() });
            return;
        }

        if (user.Locked)
        {
            context.SetError("invalid_grant", "El usuario está bloqueado. Contáctese con el administrador.");
            context.Response.Headers.Add(ServerGlobalVariables.OwinChallengeFlag,
                    new[] { ((int)HttpStatusCode.Unauthorized).ToString() });
            return;
        }

Затем в моем собственном OwinMiddleware у меня есть:

    public override async Task Invoke(IOwinContext context)
    {
        await Next.Invoke(context);

        if (context.Response.StatusCode == 400
            && context.Response.Headers.ContainsKey(
                      ServerGlobalVariables.OwinChallengeFlag))
        {
            var headerValues = context.Response.Headers.GetValues
                  (ServerGlobalVariables.OwinChallengeFlag);

            context.Response.StatusCode =
                   Convert.ToInt16(headerValues.FirstOrDefault());

            context.Response.Headers.Remove(
                   ServerGlobalVariables.OwinChallengeFlag);
        }
    }

Таким образом, я изменил ответкод от 400 (неверный запрос) до 401 (неавторизованный).Пока все хорошо, но теперь, в JavaScript, Как я могу получить набор сообщений об ошибках?

Чтобы опубликовать форму входа, у меня есть этот код:

        $.ajax({
            type: 'POST',
            url: '/Token',
            data: loginData
        }).done(function (data) {
            self.user(data.userName);
            // Cache the access token in session storage.
            sessionStorage.setItem(tokenKey, data.access_token);

            location.reload();
        }).fail(function (jqXHR) {
            hideWaitMe('#loginform');

            if (jqXHR.status == 400)    // Bad Request
            {
                swal({
                    type: 'error',
                    title: 'Ups...',
                    text: 'El nombre de usuario o la contraseña no son correctos.'
                });
            }
            else
                showError(jqXHR);

Наконец, метод showErroris:

  function showError(jqXHR) {
    self.result(jqXHR.status + ': ' + jqXHR.statusText);

    if (response) {
        if (response.message) self.errors.push(response.message);
        if (response.ModelState) {
            var modelState = response.ModelState;
            for (var prop in modelState) {
                if (modelState.hasOwnProperty(prop)) {
                    var msgArr = modelState[prop]; // expect array here
                    if (msgArr.length) {
                        for (var i = 0; i < msgArr.length; ++i) self.errors.push(msgArr[i]);
                    }
                }
            }
        }
        if (response.error) self.errors.push(response.error);
        if (response.error_description) self.errors.push(response.error_description);

        var mensaje = response.error_description;
        if (response.message && response.message != '')
            mensaje = response.message;

        swal({
            type: 'error',
            title: 'Ups...',
            text: mensaje
        });
    }
}

Свойство statusText объекта XHR просто «Не авторизовано». И свойство responseJSON имеет значение null.

Как это сделать?спасибо

Хайме

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