将 Azure Active Directory (ADAL) 与 Aurelia 结合使用的问题

Issues using Azure Active Directory (ADAL) with Aurelia

我已将 Azure Active Directory Library (ADAL) 添加到 Aurelia CLI 0.31.3 项目,但我似乎不适应。

Here is my repository.

我 运行 关注的问题是:

项目的一些注意事项:

任何有关如何解决这些问题的见解都将不胜感激!

我对 Aurelia 没有太多经验,但我采取了以下步骤使其至少部分起作用。 希望你能让它充分发挥作用:)

首先,我在 sessionState.ts 中为 ADAL.JS 启用了详细日志记录:

constructor(aureliaConfiguration, sessionState) {
    this.aureliaConfiguration = aureliaConfiguration;

    if (!this.authContext) {
        this.authContext = new AuthenticationContext(
            {
                cacheLocation: "localStorage",
                clientId: this.aureliaConfiguration.get('azureADApplicationId'),
                tenant: this.aureliaConfiguration.get('azureADTenant'),
                postLogoutRedirectUri: window.location.origin
            }
        );
        Logging = {
            level: 3,
            log: (msg) => console.log(msg)
        }
    }

    this.appName = this.aureliaConfiguration.get('name');
    this.appApiKey = this.aureliaConfiguration.get('api.key');
}

然后我发现 ADAL 给出了关于无效状态的错误。 我注意到 URL 并不是它应该的样子。 通常 Id 令牌位于片段中,例如#id_token=asdasdasdas...。 当然这只是框架显示漂亮client-side路由的功能。

原来有一种方法可以告诉 Aurelia 不要用散列修改 URLs,同时仍然使用正常的路由链接:

configureRouter(config: RouterConfiguration, router: Router): void {
    this.sessionState.router = router;

    config.title = 'Aurelia';
    config.options.root = '/';
    config.options.pushState = true;
    config.options.hashChange = false;
    config.map([
        { route: ['', 'home'], name: 'home',  moduleId: 'resources/views/home/home', nav: true, title: "Home" },
        { route: ['reports'], name: 'reports',  moduleId: 'resources/views/reports/reports', nav: true, title: "Reports", settings: { auth: true } }
    ]);
    config.addAuthorizeStep(AuthorizeStep);
}

我在那里添加了一行:config.options.hashChange = false;。 执行此操作后,ADAL 记录了成功的身份验证。

但我确实说过解决方案是部分的。 登录按钮仍然显示 "Log in"。 页面刷新后它确实变为 "Log out",但这是需要修复的一件事。 此外,单击 "reports" 确实会导致重定向到 AAD,但它将重定向 URL 指定为 http://localhost:9000/reports。 问题是我们需要将每个 client-side 路由配置为回复 URL 才能正常工作。

因此,无需使用完整的 URL,您只需使用 authorizeStep.ts 中的域:

if (!user) {
    this.sessionState.authContext.config.redirectUri = window.location.origin;
    this.sessionState.authContext.login();
}

@juunas 可能有一个可行的解决方案,但我对此的看法会略有不同。

错误几乎就是这样说的:“找不到路线”。 Aurelia 正在尝试将“token_id”匹配到一条路线,而在您的 AuthorizeStep 使用它之后,该值可能应该被忽略。

只需将它添加到您的家庭路线就足够了:

{ route: ['', 'home', 'token_id'], name: 'home',  moduleId: 'resources/views/home/home', nav: true, title: "Home" },

如果仍然不匹配,您也可以添加一个通配符:token_id*

这将解决路由器错误。您没有提到身份验证本身是否有效 - 如果路由器错误是唯一的问题,这应该可以解决问题。

编辑

要跟进我的评论,作为使用单独的 view/viewmodel 作为路线的替代方法,您也可以这样做:

config.map({
  name: 'logInRedirectCallback',
  navigationStrategy: (instruction: NavigationInstruction) => {
    const token = instruction.getWildcardPath();
    // [...] do magic / pass the token to wherever it's needed

    instruction.router.navigateToRoute(""); // or any page that makes sense after logging in
  },
  route: 'token_id=*',
});

我没有对此进行测试,因此您可能需要调整该通配符的确切位置。这在假设 token_id 作为路径的一部分而不是查询的一部分匹配的情况下起作用。但一般的想法是只拦截该令牌,根据需要对其进行处理,然后转到某个现有页面。