不能让ADAL拦截器在Angular中工作

Cant get ADAL interceptor to work in Angular

本文关键字:Angular 工作 ADAL 不能      更新时间:2023-09-26

我们的应用程序使用azure活动目录身份验证。我已经把它包括在SPA,我能够让它的工作登录。我得到一个宣誓令牌,我可以存储它并看到它。

微软的ADAL-Angular.js提供了一个拦截器,这样token就可以被添加到所有的$http调用中。它应该不需要更改SPA来使用它。我似乎无法使它工作。

我在app.js中注册了这个提供商,并把它推送到$httpprovider(尽管ADAL-Angular是这样做的)。代码如下:

       var connectionsApp = angular.module('app',
['ngRoute', 'ngResource', 'ngCookies',
    'tc.views', 'tc-flightProcessing', 'tc-agent',  'ui.bootstrap', 'ui.tab.scroll', 'AdalAngular'])
   .run(run);
connectionsApp.config(['scrollableTabsetConfigProvider', '$httpProvider', 'adalAuthenticationServiceProvider', function(scrollableTabsetConfigProvider,$httpProvider, adalAuthenticationServiceProvider){
  scrollableTabsetConfigProvider.setShowTooltips (true);
  scrollableTabsetConfigProvider.setTooltipLeftPlacement('bottom');
  scrollableTabsetConfigProvider.setTooltipRightPlacement('left');
    adalAuthenticationServiceProvider.init(
         {
            tenant: 'xxxxxxxxx-9fafd38f483f',
            clientId: 'xxx'
         }, $httpProvider);
    $httpProvider.interceptors.push('ProtectedResourceInterceptor');
 }]); 

这是服务电话。

               var getDelayCodes = function () {
                if (isPromisePending) {
                    return deferred.promise;
                }
                deferred = $q.defer();
                isPromisePending = true;
                debugger;
                $http({
                    method: 'GET',
                    url: envService.endPoint + 'delaycode'
                    headers: {'Content-Type': 'application/json'}
                })
                .then(function successCallback(response){
                    result = response.data;
                    isPromisePending = false;
                    deferred.resolve(result);
                },
                 function errorCallback(response) {
                     isPromisePending = false;
                    deferred.reject(response.data);
                });
                return deferred.promise;

如果我手动设置标题,它可以工作,但我不想在每个服务中都这样做。如此:

$http.defaults.headers.post.Authorization = "Bearer " + sessionStorage.getItem("adal.idtoken");
$http.defaults.headers.common.Authorization = "Bearer " + sessionStorage.getItem("adal.idtoken");

提前感谢您的帮助。

可能是adal.js没有将您发送请求的URL识别为"后端请求",所以它没有尝试自动注入令牌。查看这里的逻辑:https://github.com/AzureAD/azure-activedirectory-library-for-js/blob/dev/lib/adal.js#L843-L844

代码示例使用相对url,应该可以正常工作。

如果你不想使用adal.js的启发式,你应该能够通过endpoints参数显式地添加你的url: https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi/blob/master/TodoSPA/App/Scripts/app.js#L21-L26

您不需要这一行。

httpProvider.interceptors.push('ProtectedResourceInterceptor');

这个函数已经在adal库的init方法中被调用了。

  if (httpProvider && httpProvider.interceptors) {
                        httpProvider.interceptors.push('ProtectedResourceInterceptor');
                    }