当前位置: 首页 > 知识库问答 >
问题:

无记名令牌适用于ADAL,不适用于MSAL

许俊晤
2023-03-14

我有一个受保护的Web API正在运行,我想访问它。在Azure中,应用注册是:

  • 具有Web API租户管理员权限的SPA
  • Web API没有租户管理员权限,因此请求其id的令牌将返回“应用需要访问资源的权限”错误

我正在尝试获取Web API的承载令牌。问题是它不适用于MSAL,但适用于ADAL。

以下是我的“SPA”的ADAL vanilla JS代码:

window.config = {
   clientId: 'SPA client id',
   tenant: 'Tenant id',
   redirectUri: 'http://localhost:3000',
   extraQueryParameter: 'nux=1',
   popUp: true
};


var authContext = new AuthenticationContext(config);

function getToken(){
    var user = authContext.getCachedUser();
    if (!user) {
        authContext.login();
        return;
    }
    var cachedToken = authContext.getCachedToken(window.config.endpoints.prod);
    if (!cachedToken) {
        authContext.acquireToken("Web API Client Id", function(error, token) {
            console.log(error);
        });
    }
    console.log(cachedToken);
    var t = document.getElementById("token");
    t.innerText = cachedToken;
};

如果我在“邮递员”中复制令牌并执行请求,它将起作用。

MSAL代码如下:

const msalConfig = {
      auth: {
                clientId: "SPA client id",
                authority: "https://login.microsoftonline.com/Tenant id"
            }
        };

const loginRequest = {
       scopes: ["copied the scope of SPA from the Expose API"],
       redirectUri: "http://localhost:3000/"
};
 const myMSALObj = new Msal.UserAgentApplication(msalConfig);
myMSALObj.loginPopup(loginRequest).then(handleResponse).catch(function (error) { console.log(error);});
var tokenRequest = {
             scopes: ["Copied scope from the Web API expose API section"],
            };
            if (!token) {
                myMSALObj.acquireTokenPopup(tokenRequest)
                    .then(response => {
                        console.log(response);
                        setTimeout(function () { 
                        token = response.accessToken;
                    });
    console.log(token);

现在,我注意到了一个不同之处:ADAL允许我在调用acquireToken方法时传递Web Api的客户端Id,而MSAL不允许。找不到关于它的任何文档,但我推测它是从应用程序Id Uri解析的。

第二个区别在于代币索赔aud:

  • ADAL aud是Web API客户端Id

共有1个答案

司马渝
2023-03-14
匿名用户

应用程序有两个标识符,AppId的形式为xxxxxxx-xxxx-xxxx-xxx-xxxxxxxxxx,AppIdURI由用户提供。

如果我使用范围xxxxxxx-xxxx-xxxx-xxxx-XXXXXXXXXX\user。阅读它的工作原理。我以AppIdURI\user的形式使用范围。阅读。因此,除了aud之外,令牌是相同的,其中ADAL具有客户端Id(又名App Id),MSAL具有AppIdURI。将其更改为AppId,并且可以正常工作。

我不知道为什么应用程序不会接受AppIdUri,因为在“公开API”部分中,作用域被写为AppIdUri/user。阅读。

 类似资料:
  • 我正在做一个与运行时间有关的练习。exec(),我理解这个运行时。exec不是shell解释器,这就是为什么我执行“bash-c'command'”,但出于某种原因,我可以执行像ls这样的命令,但不能执行echo或重定向或多个命令。这些都不起作用: 这是我的java代码: 我使用以下语法运行上述命令: 这是有效的: 我在Ubuntu 20.04和zsh上使用openjdk 11.0.15。有人能告

  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。

  • 在pdf文件中,在按钮后面的代码中,我有 exit命令在Phantom PDF(旧版本,2.2)中运行良好,但在Foxit Reader(8.3,相当新的版本)中运行不好。那里什么也没有发生。 我还检查了一个旧的Foxit阅读器版本3.3,它在那里按预期工作。 我尝试了“安全性”和“信任管理器”设置,但这些设置并没有改善这种情况。 我想在按下按钮时关闭读卡器。

  • 因此,我正在尝试对第三方 API 提供程序进行 API 调用。在我的nodejs应用程序中接收新令牌没有问题,但是当我尝试在get函数中使用它时,我只收到403错误。但是,如果我通过Postman获得令牌,它就可以正常工作(在应用程序中),这对我来说似乎很奇怪? 如果我尝试在Postman中的get调用中使用从nodejs应用程序获取的令牌,那也是一样的,它不会起作用。 我已经多次检查从我的nod

  • 列名称的类型为int[] 上述查询适用于postgresql,但不适用于hsqldb,甚至适用于sql 尝试的hsqldb版本:2.2.9和2.3.0 在hsqldb中工作的sql是从table_name中选择x,unnest(column_name)y(x)x和y不是该表的列。