我正在使用asp.net webapi。身份验证是Thinktecture库的基本身份验证。
当用户登录时,用户名和密码将使用$CookieStore
存储在会话cookie中。
我正在为每个获取请求的标头添加凭据,如下所示
$http.defaults.headers.common['Authorization'] = 'Basic '+$cookieStore.get('__RequestVerificationToken');
问题是,我必须在每次获取请求之前调用它。有没有一种方法可以让Angular自动将其添加到标题中,当响应为401时,用户应该自动重定向到登录页面。
答案 0 :(得分:0)
您是否尝试过使用config在网站范围内设置http标头?:
var app = angular.module('myApp', []);
app.config(['$httpProvider', function($httpProvider, $cookieStore) {
$httpProvider.defaults.headers.get['Authorization'] = 'Basic '+ $cookieStore.get('__RequestVerificationToken');
}]);
请注意,在我的示例中,我专门为GET
次请求添加了默认授权标头。
关于问题的第二部分,您需要定义一个响应拦截器,它将捕获每个http响应,侦听401的状态代码并在发生时广播适当的事件(或直接重定向到登录页面): / p>
var app = angular.module('myApp', []);
app.config(['$httpProvider', '$location', function($httpProvider, $location){
var interceptor = ['$rootScope', '$q', function($rootScope, $q) {
var broadcasted;
function success(response) {
return response;
}
function error(response) {
if (response.status === 401) {
$rootScope.$broadcast('loginRequired');
// or $location.url('/login');
var deferred = $q.defer();
return deferred.promise;
}
// otherwise
return $q.reject(response);
}
return function(promise) {
return promise.then(success, error);
};
}];
$httpProvider.responseInterceptors.push(interceptor);
}]);