在我们的应用程序中,我们使用 AAD 对用户进行身份验证,但我们使用本地 SQL 数据库中自己的 User 和 Role 表来授权用户。
使用旧的 ADAL 库,我们能够将用户返回到我们的回调 url,然后我们将从那里从 ADAL 服务获取 JWT 令牌,并将该令牌发送到我们的服务器。然后,服务器将验证令牌、对其进行解码并获取电子邮件地址。然后,我们使用 SQL 表返回另一个 JWT,其中包含用户的身份及其所有角色。
对于 MSAL,如果您使用 InteractionType.Popup ,这仍然有效。loginPopup() 方法的响应 Observable 带有 AuthentiationResult,它有一个 idToken 属性和一个 accessToken 属性。您可以轻松地抓住您需要的那个,然后您就可以参加比赛了。
但是,使用 InteractionType.Redirect 我们没有得到 AuthenticationResult。
我已将 msalService 实例注入到我们的 callbackURL 的组件(称为 AuthCallbackComponent)中。我在 msalService 中到处寻找令牌,但找不到它们。我什至查看了 sessionStorage,在那里我配置了 MSAL 来缓存令牌。它们实际上在那里(在几个非常时髦的键下),但直到后来。无论我使用 ngOnInit、ngAfterViewInit 还是 ngAftercontentInit,令牌都不存在。如果我将超时设置为 1-2 秒,它确实有效,但是......不。您永远不能真正依赖超时延迟对所有用户来说都足够长。
我们希望使用重定向工作流而不是弹出式工作流,因此如果我们可以从 MSAL 实例中获取 idToken,那将是理想的选择。
我在这里找到了这篇文章:Retrieve token using msal,它提供了一些可能的解决方案,但这些建议没有帮助。它谈到了一个自定义的 MSAL 拦截器,但这似乎是错误的。这通常是 HTTP 拦截器,它将您的令牌添加到服务调用的标头中。它还说您可以订阅回调并“使用返回的令牌做一些事情”,但假设它们是指 msalService.loginRedirect() 方法的回调,那是错误的。它根本不返回任何东西。
请记住,在旧的 ADAL 库中,这是有效的。而且它仍然适用于 InteractionType.Popup (我们不能使用)。我希望这些令牌必须在某处的 MSAL 实例中,否则我们可以覆盖一个方法,我们可以提供一个回调等。
感谢您阅读这篇较长的文章。