我已经创建了Azure Core2.0API并将其发布到.NET。我有一个API管理( API Management,APIM)实例放在API前面,并做它所做的所有奇妙的事情。然而,有一件事我似乎不能理解,也找不到任何文档。对操作的授权。(不要与身份验证混淆,我在这方面做得很好)。
我的应用程序接口是一个带有CRUD操作的简单RESTful服务。让我们以一个读取操作为例:
GET /api/owner/{ownerid}/thing/{thingid}
在这种情况下,我希望能够做的是授予用户在特定所有者中读取内容的权限。同一用户可能没有不同所有者的读取权限。如果用户有权限,则为200 OK
;否则为403 Forbidden
。
留下这个完全自主的空白,对实现这个有什么建议呢?我假设APIM中的每个操作的入站策略是操作将发生的位置?如果是这样的话,是怎么做的?
更新1
我被告知在各个操作级别使用相同的validate-jwt
策略来附加到根validate-jwt
策略的可能性。其思想是,根策略验证用户是否已通过身份验证,而操作策略检查特定声明。这似乎工作得很好,但这是正确的方法,还是只是一种技巧?
更新2
要使validate-jwt
选项起作用,权限模型需要与角色和组很好地保持一致;否则,这与设置您自己的自定义数据库一样多,至少您可以从自己的规则中受益。最后,我将权限放在一个Azure Storage Account表中(任何数据库都可以),并使用一个send-request
(带有适当的缓存)来根据当前操作和用户收集权限。它工作得很好,但“感觉不对劲”。我很乐意将详细信息分享给任何想要的人。在此期间,我将暂时保留这一点,以防有人有更好的想法。
发布于 2018-09-14 07:57:35
归根结底,唯一的方法是在操作级别使用策略。您可以使用validate-jwt
检查特定的声明,也可以检查作为请求的一部分传递给您的一些其他凭据。或者,您可以使用send-request
调用其他服务并请求用户权限。在APIM本身中,除了一些基本信息之外,没有任何地方来存储任何与用户相关的数据,因此这些授权信息需要来自APIM之外。
发布于 2018-09-14 09:39:31
最后,似乎没有内置的解决方案。滚动您自己的权限模型,然后自己验证它是可行的。
然而..。
这仍然可以在APIM中完成。正如我在第二次更新中提到的,我能够使自定义解决方案工作。它的实现方式是在“所有操作”级别使用入站策略来检索权限。(使用了缓存机制,以便不会在每次调用时都检索权限。)然后,每个操作根据传入的参数确定用户是否具有该特定操作的权限。(这也会被缓存。)
结果是根API没有内置的身份验证或授权,但APIM有内置的身份验证或授权,并观察到适当的行为。
尽管如此,首选的是基于角色的访问控制方法。例如,假设单个操作被视为此角色定义中的服务:
{
"Name": "{rolename}",
"Id": "{roleid}",
"IsCustom": true,
"Description": "{roledescription}",
"Actions": [
"GET {myapi}/owner/{ownerid}/*",
"POST {myapi}/owner/{ownerid}/*",
],
"NotActions": [],
"DataActions": [],
"NotDataActions": [],
"AssignableScopes": [
"/subscriptions/{subscriptionid}"
]
}
如果这是可能的,我们可以创建角色,在订阅级别将它们分配给用户/组,然后将声明自动传递到APIM,在APIM中可以像评估任何其他声明一样对它们进行评估。
https://stackoverflow.com/questions/52300120
复制相似问题