Azure 使用ADAL的AuthenticationContext获取访问令牌

Azure 使用ADAL的AuthenticationContext获取访问令牌,azure,azure-active-directory,adal,adal.js,Azure,Azure Active Directory,Adal,Adal.js,我正在使用ADAL.js为Azure资源获取令牌 <script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.15/js/adal.min.js"></script> 为此,我编写了以下代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title><

我正在使用ADAL.js为Azure资源获取令牌

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.15/js/adal.min.js"></script>

为此,我编写了以下代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.15/js/adal.min.js"></script>
    <script>
        var endpoints = {
            "https://management.core.windows.net": "https://management.core.windows.net"
        };
        var config = {
            clientId: 'e333d3fe-a73a-4476-8121-8a57f9a972ca',
            endpoints: endpoints,
        };
        var authContext = new AuthenticationContext(config);
        authContext.handleWindowCallback();

        function login() {
            authContext.popUp = true;
            authContext.login();
           // authContext.handleWindowCallback();
            var user = authContext.getCachedUser();
            console.log(user);
        };

        function clickme() {
            var user = authContext.getCachedUser();
            console.log(user);

            authContext.acquireToken('https://management.core.windows.net', function (error, token) {
                console.log(error);
                console.log(token);
                ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                if (!!error) {
                    console.log(error.indexOf("interaction_required"));
                    authContext.acquireTokenPopup(
                        'https://management.core.windows.net/',
                        null,
                        null,
                        function (error, token, msg) {
                            console.log(error);
                            console.log(token);
                        }
                    )
                }
                +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            });
        };

        function logout () {
            authContext.logout();
        };

    </script>
    <input id="Button1" type="button" value="clickme" onclick="clickme()" />
    <input id="Button3" type="button" value="login" onclick="login()" />
    <input id="Button2" type="button" value="logout" onclick="logout()" />

    // These are the text-boxes whose value I want to retain.
    First name:<br>
    <input id=fname" type="text" name="firstname" value="Mickey">
    <br>
    Last name:<br>
    <input id="lname" type="text" name="lastname" value="Mouse">
</body>
</html>

变量端点={
"https://management.core.windows.net": "https://management.core.windows.net"
};
变量配置={
客户ID:'e333d3fe-a73a-4476-8121-8a57f9a972ca',
端点:端点,
};
var authContext=新的AuthenticationContext(配置);
authContext.HandleIndowCallback();
函数登录(){
authContext.popUp=true;
authContext.login();
//authContext.HandleIndowCallback();
var user=authContext.getCachedUser();
console.log(用户);
};
函数clickme(){
var user=authContext.getCachedUser();
console.log(用户);
authContext.acquireToken('https://management.core.windows.net,函数(错误,标记){
console.log(错误);
console.log(令牌);
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果(!!错误){
console.log(error.indexOf(“需要交互”);
authContext.acquireTokenPopup(
'https://management.core.windows.net/',
无效的
无效的
函数(错误、令牌、消息){
console.log(错误);
console.log(令牌);
}
)
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
});
};
函数注销(){
authContext.logout();
};
//这些是我想要保留其值的文本框。
名字:
错误AADSTS50079:要求用户使用多因素身份验证意味着特定最终用户必须执行或注册多因素身份验证才能获得访问令牌
acquireToken()
是静默请求,因此无法向最终用户显示MFA UI。调用
login()
无法解决此问题,因为您没有请求访问登录调用中的任何内容

解决方法是捕获此错误:

if(error.indexOf(“需要交互”)!=-1)


然后,您的应用程序可以使用或其中一个是同一资源上的交互式请求。这将提示您的最终用户完成MFA请求,您将获得访问令牌

对于注销,必须向AAD端点发出请求,该端点将处理相应会话cookie的清除。我不认为可以避免页面刷新,除非有一种方法可以通过从隐藏的iframe发出请求来避免刷新。我已经尝试过:
authContext.acquireToken('https://management.core.windows.net/,函数(error,token){console.log(error.indexOf(“interaction_required”);}
。日志中的-1已打印。我已根据您的回答更新了代码和问题。请查看。错误消息:弹出窗口为空。如果您正在使用IE:则可能会发生这种情况,因为该特定站点的chrome上阻止了弹出窗口“……仍然错误。indexOf(“需要交互”)只有我才能使用-1。@AkashAgarwal您可以打开浏览器调试器,看看
error
在这种情况下是怎么说的吗?您可能还需要捕获其他错误。