如许多示例所示,我有两个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中,并验证了其签名,受众,发行者和角色,那么我不需要这种额外的复杂性吗?
答案 0 :(得分:0)
您能否提供一个链接,显示需要两个应用程序?仅当要向浏览器提供JS的Web应用程序未提供您要调用的API时,才应如此。 'official' samples都不要求您注册两个应用程序(在某些示例中使用的Graph API是单独的API,并且已经注册)。从浏览器传递的令牌的问题在于,它们是由公共客户端获取的,除了使用用户凭据以外,没有使用任何秘密。因此,它们更容易偷窃和重复使用。您自己的后端应用程序可能想要使用秘密来获取其自己的令牌(扩展授权),以使用不在公共客户端中的令牌来调用另一个API。
答案 1 :(得分:0)
嗯,我想我知道您的去向:无论他们使用哪种客户端应用程序访问API,您都希望控制哪些用户可以访问API。这是API的功能-您无法通过AAD进行控制。在AAD中,您可以使用用户访问限制(“企业”选项卡)或基于角色的访问控制哪些用户可以访问哪些应用程序(UI)。但是,在调用应用程序级别中,通过范围在AAD中控制对 API 的访问。用户从不直接访问API,而只能由其他应用程序直接访问API,因此在用户级别控制访问权限会引起管理员的麻烦。因此,您可以控制用户在使用的应用程序中拥有哪些权限,还可以控制该应用程序(客户端)在其使用的其他应用程序(API,资源服务器)中具有哪些权限。
换句话说:角色与用户对UI的访问有关,作用域与一个应用程序对另一应用程序的访问有关。
应用程序秘密为获取令牌提供了更高的安全性-与令牌中包含的权限无关。