首页 文章

使用ADAL.js将ClientId用作 endpoints 中的受众,用于SPA配置

提问于
浏览
2

我正在创建一个AngularJS客户端来与两个ASP.Net Core(v2.0)API进行交互,所有这些API都要使用Azure AD进行保护 . 由于需要使用角色和组,我们将使用v1 endpoints ,因此使用ADAL.js. UI客户端必须是每个API的单独项目,另外UI项目不是Visual Studio项目,而是具有npm的VSCode . 在我正在使用的UI项目中:

  • AngularJS 1.6.9

  • UI-Router 1.0.15

  • ADAL.js 1.0.17

经过长时间的反复试验,我在完成以下步骤后终于获得了对API进行身份验证的UI:

在UI项目中,我在Adal init()函数中包含了 endpoints :

var endpoints = {
    'http://localhost:8000/api0/': '<API_0_CLIENT_ID HERE>',
    'http://localhost:8001/api1/': '<API_1_CLIENT_ID HERE>',
};

adalAuthenticationServiceProvider.init(
  {
    tenant: 'slurm.onmicrosoft.com',
    clientId: '00000000-0000-0000-0000-XXXXXXXXXX',
    endpoints: endpoints
  },
  $httpProvider
);

有两个 endpoints ,一个是每个API的基本URL,每个 endpoints 都有一个相应的clientId,用于在每个API在Azure AD中注册时分配的API . 此外,在Azure AD中注册时,UI项目被授予对每个API的适当权限 . 一旦我在init()函数中设置了这些 endpoints ,并且UI具有API的每个clientId,UI就能够正确地对两个API进行身份验证 . 这个问题最终让我想到了这个问题:32352325

如果我不在UI项目中提供 endpoints ,则令牌甚至不会传递回API,因此验证失败 .

我不确定(没有明确的文档),是否应将UI clientId设置为每个API中的audienceId,或者是否将每个API客户端ID嵌入UI中 .

Questions:

1)对于与每个API分开的AngularJS UI项目,并且每个项目在Azure AD中单独注册,我们是否将UI clientId注册为每个API的受众,或者允许客户端了解每个API clientId?

2)为什么看起来需要在客户端的ADAL init()函数中指定 endpoints ?还是我错误地使用它们?

基于this Azure-Samples project的自述文件,UI看起来应该知道每个API的clientId(在步骤3,配置它所说的WebApp):

在TodoListWebApp项目中,//...//找到TodoListResourceId属性并将该值替换为TodoListService应用程序的应用程序ID

但是,此示例不是SPA示例,因此不使用隐式流 .

非常感谢提前!

1 回答

  • 1

    这是我最终推断出的(经过大量的挖掘和试验和错误) . 该示例再次假设UI是与任何API分开的项目 . 对于上面的原始问题:

    1)对于与每个API分开的AngularJS UI项目,并且每个项目在Azure AD中单独注册,我们是否将UI clientId注册为每个API的受众,或者允许客户端了解每个API clientId?

    客户端UI了解每个API但使用App ID URI

    2)为什么看起来需要在客户端的ADAL init()函数中指定 endpoints ?还是我错误地使用它们?

    继续阅读 .

    对于UI将访问的每个API,需要在 endpoints 映射结构中声明 endpoints . 例如,假设我正在尝试使用以下相关信息访问在AAD中注册的2个单独的API:

    租户:slurm.onmicrosoft.com API_0主页URL:'https:// localhost:8000'应用程序ID URI:'https://slurm.onmicrosoft.com/00000000-0000-0000-0000-aaaaaaaaaaaa'API_1主页URL:'https:// localhost:4000'应用程序ID URI:'https://slurm.onmicrosoft.com/00000000-0000-0000-0000-bbbbbbbbbbbb'

    adalAuthenticationServiceProvider.init(
      {
        tenant: 'slurm.onmicrosoft.com',
        clientId: '00000000-0000-0000-0000-XXXXXXXXXX',
        endpoints: {
            'localhost:8000': 'https://slurm.onmicrosoft.com/00000000-0000-0000-0000-aaaaaaaaaaaa',
            'localhost:4000': 'https://slurm.onmicrosoft.com/00000000-0000-0000-0000-bbbbbbbbbbbb',
        }
      },
      $httpProvider
    );
    

    以下是参考资料:

    输入To Go API endpoints 位置到其资源标识符或App ID URI的映射 . endpoints 对象的属性名称应该是To Go API的位置 .

    此外,如果您查看代码示例,您将在ToGoAPI的web.config中看到它表示“Audience”值设置为ToGoAPI的App ID URI

    注意:上面使用的App Id URI有意保留为与注册应用程序时Azure AD将提供的默认值类似的格式 . 这些可以改变(只要确保你到处改变它) .

    注意2:在 endpoints 映射中,您会看到密钥不包含该方案,并且与相应的主页URL不完全匹配 . 当我包括该方案,即https://我从API获得了401响应

相关问题