1

我有一个 AngularJS 网络应用程序,我在其中使用基本身份验证。这很好用,但是当用户输入错误的电子邮件或密码时,我想给他们一个很好的错误信息。因此,我返回 401 并带有如下解释的原因:http: //leastprivilege.com/2013/04/22/web-api-security-basic-authentication-with-thinktecture-identitymodel-authenticationhandler/

这可以正常工作,并且正确返回带有原因短语的 401。但是,使用 Angular 的 $http 会解释状态码为 0 而不是 401 的响应,而且没有机会阅读我想传递给我的用户的原因。例如。未知的电子邮件或错误的密码。

我已经在 Chrome 和 Firefox 中对此进行了测试,并且一直在浏览大量问题但没有找到任何答案。我已经实现了这样的响应拦截器:

$httpProvider.responseInterceptors.push(function ($timeout, $q) {
        return function (promise) {
            return promise.then(function (successResponse) {
                if (successResponse.config.method.toUpperCase() != 'GET')
                    showMessage('Success', 'successMessage', 5000);
                return successResponse;

            }, function (errorResponse) {
                console.log("status: " + errorResponse.status, errorResponse.config);
                switch (errorResponse.status) {
                    case 0:
                    case 401:
                        showMessage('Wrong email or password', 'errorMessage', 20000);
                        break;
                    case 403:
                        showMessage('You don\'t have the right to do this', 'errorMessage', 20000);
                        break;
                    case 500:
                        showMessage('Server internal error: ' + errorResponse.data, 'errorMessage', 20000);
                        break;
                    default:
                        showMessage('Error ' + errorResponse.status + ': ' + errorResponse.data, 'errorMessage', 20000);
                }
                return $q.reject(errorResponse);
            });
        };
    });

调试拦截器工作时,但状态码绝不是 401,而是 0。在 Chrome 控制台中,它显示:

XMLHttpRequest cannot load http://localhost:64044/api/user/login/. Origin     
http://localhost:63546 is not allowed by Access-Control-Allow-Origin. 

我有机会让它工作吗?

4

1 回答 1

0

这里的问题是您正在向与托管 JavaScript 的服务器不同的服务器发出请求。您将不得不使用 jsonp 来绕过此错误消息。

于 2013-09-18T03:01:48.293 回答