我创建一个Azure APIM实例,将其注册为AD中的一个应用程序,然后在APIM下创建一个OAUTH2.0服务器,该APIM使用上述已注册应用程序的clientid / secret密钥进行设置。我在此APIM下创建了一个虚拟API,然后使用此OAUTH2.0服务器对其进行保护。我还在我的api上添加了JWT策略,以查找令牌并根据租户ID进行身份验证。(未提及任何声明)。
现在可以说,我有一个客户(ABC),为此,我在AD中注册了另一个应用程序并创建其Clientid / secret。客户在令牌端点的帮助下生成其令牌(此端点在“ AD应用程序注册”选项的“端点”选项卡下给出)。客户使用此令牌调用API,该API即可正常工作。
问题:我没有将AD中的APIM应用授予AD中的Client App的任何许可,但它仍然有效,这实际上意味着来自AD中注册的任何应用的任何Clientid /秘密都将通过我的JWT策略API。因为这只是针对tenantid的验证。我们如何才能停止它并确保它仅对获得许可的客户有效。
答案 0 :(得分:0)
这是我在最近的文章https://joonasw.net/view/azure-ad-authentication-aspnet-core-api-part-1中提到的主要内容之一。
Azure AD中任何类型为Web App / API的应用程序都可以获取该Azure AD租户中任何API的有效访问令牌。 甚至在未授予任何权限之前。 我猜这是一种“功能”。
文章引用:
如果仅需要经过身份验证的用户,则Azure AD中的任何机密客户端都可以获取API的访问令牌并对其进行调用。因此,至少要实现user_impersonation范围检查很重要。
现在,由于调用者将自己调用API,因此您需要实现应用许可。 您可以在此处查看如何定义它们:https://joonasw.net/view/defining-permissions-and-roles-in-aad。
然后实施检查,以确保roles
声明包含您定义的应用许可的value
。
声明将是一个字符串数组,因此需要进行某种包含检查。
然后,这将要求授予此应用程序许可权,然后调用者才能成功进行呼叫。
如果您还希望允许代理呼叫(即代表用户的呼叫),
然后为user_impersonation
范围添加可选要求。
它们存储在以空格分隔的单个字符串声明(scp
)中。
因此,为此,您需要对字符串进行包含检查。