1

首先,我将描述我如何设置我的应用程序,然后我将描述我如何使用 API。

设置

  1. 在我的Azure Active Directory中,我注册了两个应用程序:UI 和后端
  2. UI 具有客户端 ID clientId1,后端具有客户端 ID clientId2(这是一个 GUID,但为简单起见)
  3. 两者都在同一个租户下 tentant1(单租户)

后端(Web API)

  1. 后端有一个公开的 API,其范围为“api://clientId2/access_as_user”和授权客户端“clientId1”,其中刚刚提到的范围被选中
  2. 我正在使用passportand passport-azure-ad(我几乎复制了https://github.com/Azure-Samples/active-directory-javascript-nodejs-webapi-v2)。
  3. 我的配置:

    const config = {
        identityMetadata: "https://login.microsoftonline.com/tenant1/v2.0/.well-known/openid-configuration",
        clientID: "clientId2",
        validateIssuer: false,
        loggingLevel: 'info',
        passReqToCallback: false,
        loggingNoPII: false
    };
    
  4. 启动服务器时收到此消息:
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":16052,"level":40,"msg":"Production environments should always validate the issuer.","time":"2020-04-11T13:25:44.283Z","v":0}
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":16052,"level":30,"msg":"In BearerStrategy constructor: created strategy with options {\"identityMetadata\":\"https://login.microsoftonline.com/tenant1/v2.0/.well-known/openid-configuration\",\"clientID\":\"clientId2\",\"validateIssuer\":false,\"loggingLevel\":\"info\",\"passReqToCallback\":false,\"loggingNoPII\":false,\"clockSkew\":300,\"allowMultiAudiencesInToken\":false,\"audience\":[\"clientId2\",\"spn:clientId2\"]\"isB2C\":false,\"_isCommonEndpoint\":false}","time":"2020-04-11T13:25:44.285Z","v":0}
Listening on port 5000

用户界面(角度 SPA)

  1. UI 具有权限被自动授予访问 Microsoft Graph 的权限(配置文件、user.read、user.read.all - 我认为我授予的最后一个)。权限在“API 权限”中
  2. 我继续并授予对后端 access_as_user 的访问权限
  3. 对于 UI 代码,我使用的是 MSAL 库,并且我几乎复制了 repo ( https://github.com/Azure-Samples/active-directory-javascript-singlepageapp-angular )
  4. 在该protectedResourceMap字段中,我添加了以下内容
 ['https://graph.microsoft.com/v1.0/me', ['user.read']],
 ['http://localhost:5000', ['api://clientId2/access_as_user']],
  1. 我能够登录并阅读我的用户配置文件,但是在尝试访问http://localhost:5000/hello(受保护)时,我收到了这个问题的标题错误
{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":20720,"level":30,"msg":"authentication failed due to: jwt audience is invalid","time":"2020-04-11T13:38:08.700Z","v":0}

--

我可以看到承载令牌来了(在 UI 和后端),服务器解码令牌(我可以在服务器日志中看到我的所有配置文件信息),但它说 JWT 无效?!

我没有定义观众,但是当它被解码时,我可以在令牌中看到观众aud: 'api://clientId2'

我还可以看到后端何时启动它[clientId2, sps:clientId2]默认显示观众(后端的第 4 步)。当我在 config 中定义时audience: 'api://clientId2',我得到一个 403 消息:

{"name":"AzureAD: Bearer Strategy","hostname":"DESKTOP-NCVLN56","pid":12644,"level":30,"msg":"In Strategy.prototype.jwtVerify: We did not pass Req back to Callback","time":"2020-04-11T16:19:30.398Z","v":0}

任何帮助,将不胜感激。谢谢你。

4

2 回答 2

1

原来他们在存储库中的代码没有使用正确的配置来验证范围访问......

https://github.com/Azure-Samples/active-directory-javascript-nodejs-webapi-v2/blob/master/index.js#L41

        if (req.authInfo['scp'].split(" ").indexOf("demo.read") >= 0) {

我需要将范围从“demo.read”更改为“access_as_user”。

于 2020-04-11T22:59:53.233 回答
0

就我而言,只是运行应用程序的虚拟机的时钟落后了 15 分钟。所以创建令牌的时间是在未来......

于 2021-10-08T08:47:37.427 回答