ADAL 请求uireADLogin 和angular-ui-路由器?

ADAL requireADLogin and angular-ui-router?

我有一个 angular (1.x) SPA,我正在尝试通过 ADAL 保护它以要求通过 Azure AD 进行身份验证。 然而,即使是标有 requireADLogin: true 的 routes/pages/states 似乎也允许用户在不需要授权的情况下访问它们。

我想知道问题是不是我使用的是 angular-ui-router (0.4.2) 而不是 ngRoute,因此我对 routes/states 的配置没有真正考虑在内。

我的 HTMl 模板显示 userInfo 并且在第一次加载时是 {"isAuthenticated":false,"userName":"","loginError":""},但是页面加载(包括子 route/state),即使我设置 requireADLogin: true shell and/or 子状态(见下文)。

我有一个登录按钮,指向弹出窗口中的登录顺序,完成后,页面会显示已登录用户的用户信息, 所以我想我把剩下的都安排好了。 v

// My top-level app config block:
function AppConfig($stateProvider, $urlRouterProvider, $httpProvider, adalAuthenticationServiceProvider) {

    // Configure the urlRouteProvider to redirect to /intro by default
    $urlRouterProvider.otherwise("/intro");

    // Configure the ADAL Auth Provider
    adalAuthenticationServiceProvider.init({
        tenant: "[MyTenantID]",
        clientId: "[MyClientID]",
        popUp: true
    }
    // // pass http provider to inject request interceptor to attach tokens
    // $httpProvider
    );
}

// Later I set up my shell state/route (all other states are children of this one):
$stateProvider.state('shell', {
    //blank url as the shell is an abstract parent to every other state
    url: '',
    templateUrl: 'app/shell/shell.html',
    controller: 'ShellController',
    controllerAs: 'vm',
    abstract: true,
    requireADLogin: false   // <-- tried with requireADLogin: true
});

// Intro (aka shell.intro) should be the default state:
$stateProvider.state('shell.intro', {
    url: '/intro',
    templateUrl: 'app/intro/intro.html',
    controller: 'IntroController',
    controllerAs: 'vm',
    data: {
        pageTitle: 'Intro'
    },
    requireADLogin: true
});

我对你的代码片段进行了快速测试,发现主要的罪犯可能是在 adalAuthenticationServiceProvider.init 功能下评论句子 $httpProvider 的操作。

请取消注释这句话,代码示例中也提供了原因 https://github.com/AzureAD/azure-activedirectory-library-for-js#getting-started:

$httpProvider // pass http provider to inject request interceptor to attach tokens

我这边会解决你的问题,请试试。