首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MSAL.js遍历租户

使用MSAL.js遍历租户
EN

Stack Overflow用户
提问于 2020-02-18 01:48:00
回答 1查看 196关注 0票数 0

我使用MSAL.js登录并使用Graph。

我创建的Azure应用程序是一个多租户,在针对特定租户运行时具有正确的权限,因此我可以确认这一点。

障碍在于,我希望能够遍历我们所有的租户,以获得图形API中可用的任何数据。

我试图简单地更改MSAL连接的配置,但是这失败了,每次调用都将使用现有的authority值。

在此之后,我创建了一个带有forEachtenantid数组,以便它循环通过,但是这产生了相同的结果。

我创建了一个注销函数,每次都被调用,但是这需要将您从页面重定向到您的注销地址。

我的代码:

代码语言:javascript
复制
function config_app(tenantid, callback, apiUrl) {
    var applicationConfig = {
        auth: {
            clientId: "XXXX-XXXX-XXXX-XXXX",
            authority: "https://login.microsoftonline.com/" + tenantid,
            redirectUri: "https://my.redirecturi.com/fake"
        },
        cache: {
            cacheLocation: "sessionStorage",
            storeAuthStateInCookie: false
        }
    };
    var msalInstance = new Msal.UserAgentApplication(applicationConfig);
    callback(tenantid, applicationConfig, msalInstance, callMSGraph, apiUrl);
}
function sign_in(tenantid, applicationConfig, msalInstance, callback, apiUrl) {
    var scopes = {
        scopes: ["Organization.Read.All"],
        loginHint: "my@email.com"
    };
    msalInstance.acquireTokenSilent(scopes).then(response => {
        callback(response.accessToken, graphAPICallback, apiUrl);
    }).catch(err => {
    });
}
function callMSGraph(accessToken, callback, apiUrl) {
    console.log("calling ms graph");
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200)
            callback(JSON.parse(this.responseText));
    }
    xmlHttp.open("GET", "https://graph.microsoft.com/v1.0/" + apiUrl, true);
    xmlHttp.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    xmlHttp.send();
}
function graphAPICallback(data) {
    $('#o365res').append(JSON.stringify(data, null, 2));
}
config_app('XXX-XXX-XXX-XXX-XXX', sign_in, 'organization');

我试图通过以下方法将一些租户ID添加到数组和循环中:

代码语言:javascript
复制
var clients = ['XXX-XXX-XXX-XXX-XXX','YYYY-YYYY-YYYY-YYYY'];
clients.forEach(function(e) {
    config_app(e, sign_in, 'organization');
});

经过多次阅读,我似乎无法在没有重定向的情况下使用注销函数,我更希望能够通过authority值简单地更改租户,并使用相同的令牌跳转。

我正在使用MSAL v1.2.0

我希望将租户的所有Organization数据显示在一个页面上,然后将其扩展为从API中提取安全分数和任何其他有价值的数据。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-28 02:52:49

在与MSAL.js的友好开发人员联络之后,我完成了我的解决方案。

GitHub问题:

我的原著

他们说这与此有关/重复。

但是,我发现,通过简化函数并将forceRefresh: true,添加到作用域,每次传递都能够更改权限并提取所需的数据。

以下是我的职责:

代码语言:javascript
复制
function getData(tenantid,apiUrl) {
    return new Promise(resolve => {
        var applicationConfig = {
            auth: {
                clientId: "AZURE-APP-ID-HERE",
                authority: "https://login.microsoftonline.com/" + tenantid,
                redirectUri: "https://my.redirect.uri/uri"
            },
            cache: {
                cacheLocation: "localStorage",
                storeAuthStateInCookie: false
            }
        };
        var msalInstance = new Msal.UserAgentApplication(applicationConfig);
        var scopes = {
            forceRefresh: true,
            scopes: ["Organization.Read.All"],
            loginHint: "user@email.com"
        };
        msalInstance.acquireTokenSilent(scopes).then(response => {
            var xmlHttp = new XMLHttpRequest();
            xmlHttp.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {
                    var data = JSON.parse(this.responseText);
                    $('#o365res').append(JSON.stringify(data, null, 2));
                    resolve();
                }
            }
            xmlHttp.open("GET", "https://graph.microsoft.com/v1.0/" + apiUrl, true);
            xmlHttp.setRequestHeader('Authorization', 'Bearer ' + response.accessToken);
            xmlHttp.send();
        }).catch(err => { });
    });
}
function getDataChain(clients) {
    const nextClient = clients.shift();
    if (nextClient) {
        return getData(nextClient,'organization').then(_ => getDataChain(clients))
    } else { return Promise.resolve(); }
}

然后是我的客户机ID数组并调用chain函数:

代码语言:javascript
复制
var clients = ['XXX-XXX-XXX-XXX-XXX','YYY-YYY-YYY-YYY-YYY'];
getDataChain(clients).then(_ => console.log("all finished"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60272662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档