Azure active directory 将Azure Active Directory(ADAL)与Aurelia一起使用时出现的问题
我已经添加到一个Aurelia CLI 0.31.3项目中,我似乎已经脱离了我的元素 我遇到的问题有:Azure active directory 将Azure Active Directory(ADAL)与Aurelia一起使用时出现的问题,azure-active-directory,aurelia,adal,Azure Active Directory,Aurelia,Adal,我已经添加到一个Aurelia CLI 0.31.3项目中,我似乎已经脱离了我的元素 我遇到的问题有: 首次访问“报告”页面允许您登录。 当它从Azure广告登录返回时,Aurelia应用程序将重新加载 两次 在“主页”上单击“登录”即可登录 在里面当它从Azure广告登录返回时,URL包含 “/token_id=XXXX”和Aurelia路由器错误,声明“路由不可用” 找到” 关于该项目的一些说明: 只有两种观点。“主页”不需要身份验证。“报告”确实如此 ./src/app.ts、./
- 首次访问“报告”页面允许您登录。 当它从Azure广告登录返回时,Aurelia应用程序将重新加载 两次李>
- 在“主页”上单击“登录”即可登录 在里面当它从Azure广告登录返回时,URL包含 “/token_id=XXXX”和Aurelia路由器错误,声明“路由不可用” 找到”
- 只有两种观点。“主页”不需要身份验证。“报告”确实如此
- ./src/app.ts、./src/authorizeStep.ts和./src/sessionState.ts应该是唯一存在任何身份验证代码的位置
任何关于如何解决这些问题的见解都将不胜感激 我对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=asdasdas…
。
当然,这只是框架显示漂亮客户端路由的特性
事实证明,有一种方法可以告诉Aurelia不要使用哈希修改URL,同时仍然使用正常的路由链接:
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记录了一个成功的身份验证
但我确实说过解决方案是片面的。
登录按钮仍然显示“登录”。
页面刷新后,它确实会变为“注销”,但这是一件需要修复的事情。
此外,单击“报告”确实会导致重定向到AAD,但它将重定向URL指定为http://localhost:9000/reports
。
问题是,我们需要将每个客户端路由配置为回复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\u id*
这将解决路由器错误。您还没有提到身份验证本身是否有效-如果路由器错误是唯一的问题,那么应该这样做
编辑
要跟进我的评论,作为使用单独视图/视图模型作为管线的替代方案,您还可以执行以下操作:
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=*',
});
我还没有测试过这个,所以你可能需要调整这个通配符的确切位置。这是在假设令牌_id作为路径的一部分而不是查询的一部分进行匹配的情况下工作的。但总体思路是截取该令牌,根据需要进行处理,然后转到某个现有页面。谢谢您的回复!不幸的是,解决方案的任何一部分都没有改善情况。我能够从一开始就成功地进行身份验证,很抱歉没有说清楚。问题在于回调是如何触发的。正如您所说,部分解决方案相当成功,但不幸的是,ADAL客户端没有收到授权成功的通知。另外,将“window.location.href”更改为“window.location.origin”意味着回调不会将用户返回到他们试图访问的页面。它总是回到“家”。谢谢你的回复!我能够从一开始就成功地进行身份验证,很抱歉没有说清楚。问题在于回调是如何触发的。这确实解决了路由器抛出错误的问题,但是它不会导致ADAL客户端收到认证成功的通知。因此,我无法在不刷新页面的情况下确定身份验证状态。公平地说,在这种情况下,您需要添加一个与该特定路由匹配并通知客户端的AuthorizeStep
,或者更简单一点(但稍微“干净”)您可以简单地制作一个特殊的auth.ts+html
或类似的东西。将token\u id
路由到该页面,并在该特定页面的代码中,从activate()
中的params
获取令牌,然后将其传递给客户端。(如果您愿意,我可能会在稍后添加一个适当的示例,现在有点匆忙)我想您可能会对auth.ts+html建议有所了解。我以前从未考虑过这一点。我相信这将解决必须配置多个返回路由的问题,我确实希望避免这种情况,并且一旦身份验证返回,我可以将用户重新路由到他们请求的路由。不幸的是,由于新的优先事项,我目前没有积极参与这个项目,但我会将此标记为可接受的答案。谢谢当然可以如果你还没有,我建议你看看这个插件:-如果插件本身没有抓痒,看看它的代码也应该给你一些可靠的例子,直接在路由管道中处理身份验证。真的很整洁,太棒了!我来看看。谢谢