如何使用Javascript获取DotNetOpenAuth.OAuth2返回的错误消息

时间:2018-12-06 22:49:32

标签: c# oauth-2.0 asp.net-web-api2 dotnetopenauth bearer-token

在我的自定义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);

最后,showError方法是:

  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
        });
    }
}
XHR对象的

statusText属性仅为“未经授权”。responseJSON属性为null。

我该怎么办?谢谢

Jaime

0 个答案:

没有答案