0

我在我的网络应用程序上使用 azure b2c 和 msal.js 来处理我的网络应用程序上的身份验证。

当用户单击登录时,我正在使用所需范围调用 msal.js 库中的登录 api。

function login() {
    clientApplication.loginRedirect(applicationConfig.b2cScopes);
}

这按预期工作。但是,当用户尝试创建 API 时,我的代码调用 msal.js 的获取令牌静默 api,这在 Safari 中每次都会失败。我相信这是由于 Safari 中的 iFrame 安全策略。当我在 Safari 中关闭“防止跨站点跟踪”时,一切正常。

function callApiWithToken(url, type, body) {
    return clientApplication.acquireTokenSilent(applicationConfig.b2cScopes).then(function (accessToken) {
        return callApiWithAccessToken(url, type, accessToken, body);
    }, function (error) {
        clientApplication.acquireTokenPopup(applicationConfig.b2cScopes).then(function (accessToken) {
            return callApiWithAccessToken(url, type, accessToken, body);
        }, function (error) {
            throw "Error acquiring the access token to call the Web api:" + error;
        });
    })
}

上面的代码尝试以静默方式获取令牌失败,然后调用acquireTokenPopup,它可以工作,但会首先将用户重定向到再次登录。

有没有办法要求用户登录两次?据我了解,登录调用仅返回一个 ID 令牌,这不适合进行 api 调用,因为我应该使用访问令牌。

如果有帮助,这是网络应用程序:link

4

1 回答 1

1

安全团队和其他一些面临相同问题的用户记录了一个解决方案。

构造 UserAgentApplication 实例时,在选项对象中将 navigateToLoginRequestUrl 设置为 false:

msalClientApplication = new Msal.UserAgentApplication(clientID, authority, () => {}, {
    navigateToLoginRequestUrl: false
})
于 2019-01-14T18:25:32.210 回答