为什么只需要两个AAD应用程序即可将角色添加到访问令牌中?

问题描述 投票:0回答:2

如许多示例所示,我有两个AAD应用程序注册,一个用于基于JavaScript的前端,一个用于仅JSON的Web API。

如果我完全信任我的客户端AAD应用程序,为什么AAD要求我为我的Web API创建第二个AAD应用程序?

例如,假设我向客户端AAD应用程序添加了特定角色,如果客户端使用AAD登录并获得包含我的角色的ID令牌和访问令牌,则只需将访问令牌发送到我的API。该API仅需破解JWT,验证受众,发行者,租户,角色权限和签名即可。在这个世界上,Web API不需要客户端密码,不需要第二次AAD应用程序注册,并且仍然不需要从我的API调用AAD。不幸的是,如果没有两个AAD应用程序,我将无法找到一种将AAD包含角色包含在访问令牌中的方法。

如果我不完全相信发行人不会提出索赔要求,我会明白为什么我需要两个AAD应用程序和一个客户机密。但是,由于我确实信任我的AAD应用程序和JWT的签名,为什么还要增加复杂性?还是有一种我找不到的方法?

谢谢!


在这里回复Marc,因为注释字段中的字符太少-您引用的The sample是一个很好的示例,特别是JavaScript one calling the Web API。实际上,这就是我现在正在做的事情。但是,问题在于示例中的Web API向在租户上进行身份验证的任何人开放。我需要将Web API保护给租户中的某些个人,并且仅检查客户端/应用程序ID不足以anybody who can create an AAD app can fake it

所以我需要做的是将角色添加到访问令牌中,因此我知道我的应用程序已对用户进行身份验证,并且该用户已获得所需的角色。例如,这是一个Microsoft sample。甚至here整个过程中的Microsoft视频。

如果我没有两个带有客户端密码的AAD应用程序,则访问令牌中永远不会提供角色声明。它总是在id令牌中提供,但在访问令牌中不提供。

我觉得我在这里缺少明显的东西。如果AAD在我对JWT进行身份验证时只是将我请求的角色放入JWT,并验证了其签名,受众,发行者和角色,那么我就不需要这些额外的复杂性吗?

azure-active-directory
2个回答
0
投票

您能否提供一个链接,显示需要两个应用程序?仅当要向浏览器提供JS的Web应用程序未提供您要调用的API时,才应如此。 'official' samples都不要求您注册两个应用程序(在某些示例中使用的图形API是单独的API,并且已经注册)。从浏览器传递的令牌的问题在于,它们是由公共客户端获取的,除了使用用户凭据以外,没有使用任何秘密。因此,它们更容易偷窃和重复使用。您自己的后端应用程序可能想要使用秘密来获取其自己的令牌(扩展授权),以使用不在公共客户端中的令牌来调用另一个API。


0
投票

[啊,我想我知道您的去向:您想控制哪些用户可以访问API,无论他们使用什么客户端应用程序访问API。这是API的功能-您无法通过AAD进行控制。在AAD中,您可以使用用户访问限制(“企业”选项卡)或基于角色的访问控制哪些用户可以访问哪些应用程序(UI)。但是,通过作用域在调用应用程序级别的AAD中控制对API的访问。用户从不直接访问API,而只能由其他应用程序直接访问API,因此在用户级别控制访问权限会引起管理员的麻烦。因此,您可以控制用户在使用的应用程序中拥有哪些权限,还可以控制该应用程序(客户端)在其使用的其他应用程序(API,资源服务器)中具有哪些权限。

换句话说,角色与用户对UI的访问有关,作用域与一个应用程序对另一应用程序的访问有关。

应用程序机密为获取令牌提供了更高的安全性-与令牌中包含的权限无关。

© www.soinside.com 2019 - 2024. All rights reserved.