如果用户从msal .net代码登录,则无法使用msal.js静默获取访问令牌

时间:2019-07-09 14:28:26

标签: msal msal.js

我从GitHub下载了示例,以试用Azure AD B2C https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi

我已经为我的AADB2C重新配置了此Web应用程序,并且一切正常。

为了也尝试使用MSAL.js,我添加了一个新页面,该页面实现了登录用户的get访问令牌。用户使用服务器端代码登录。 但是,我无法为登录的用户获取缓存的用户会话,因为MSAL.js似乎不知道该用户已经从服务器端代码登录,反之亦然。

这是我用来获取登录的用户会话并尝试以静默方式获取令牌的代码。

if (msalInstance.getAccount()) {
    var tokenRequest = {
        scopes: ["user.read", "mail.send"]
    };
    msalInstance.acquireTokenSilent(tokenRequest)
        .then(response => {
            // get access token from response
            // response.accessToken
        })
        .catch(err => {
            // could also check if err instance of InteractionRequiredAuthError if you can import the class.
            if (err.name === "InteractionRequiredAuthError") {
                return msalInstance.acquireTokenPopup(tokenRequest)
                    .then(response => {
                        // get access token from response
                        // response.accessToken
                    })
                    .catch(err => {
                        // handle error
                    });
            }
        });
} else {
    // user is not logged in, you will need to log them in to acquire a token
}

即使用户已经使用Microsoft.Identity Code(MSAL C#lib)登录,msalInstance.getAccount()函数也将始终返回null。

如果用户使用服务端代码登录,那么任何人都可以通过静默获取访问令牌。

1 个答案:

答案 0 :(得分:0)

有同样的问题。 奇怪的是,当您的.js应用程序开发人员Msal.js遇到安全问题时, 采用在.net应用程序中启动的会话。尽管客户端不是放置这种安全机制的正确位置。 这是我找到该信息的地方:related issue on github

通过将会话ID或login_hint添加到AcquisitionTokenSilent(),可以在具有msal.js的.js应用程序中采用.net启动的会话。可以在这里找到更多信息:official msal.js documentation