我创建了一个.NET Core 2.0 API并将其发布到Azure。我有一个面向API的API管理(APIM)实例,并完成它所做的所有精彩事情。但是,有一件事我似乎无法绕过头脑或找到任何文档。运营授权。 (不要与身份验证混淆,我工作得很好)。
我的API是一个简单的RESTful服务,具有CRUD操作。我们以读取操作为例:
GET /api/owner/{ownerid}/thing/{thingid}
在这种情况下,我希望能够做的是授予用户在特定OWNER中阅读的权限。同一用户可能没有与其他所有者的读取权限。如果用户有权限,200 OK
;否则,403 Forbidden
。
完全放弃这个,有什么建议来实现这个?我假设APIM内的每个操作的入站策略都是在哪里进行操作?如果是这样,怎么样?
更新1
我被告知可以在各个操作级别使用相同的validate-jwt
策略来附加根源上的validate-jwt
策略。这个想法是根策略验证在操作策略检查特定声明时用户是否经过身份验证。这似乎运作良好,但这是正确的方法,还是只是一个黑客?
更新2
要使validate-jwt
选项起作用,权限模型需要与角色和组完全一致;否则,它与设置您自己的自定义数据库一样多,其中至少您可以从自己的规则中受益。最后,我将权限放在Azure存储帐户表中(任何数据库都可以)并使用send-request
(具有适当的缓存)来根据当前操作和用户收集权限。它运作良好,但“感觉不对”。我很乐意与任何想要的人分享细节。与此同时,如果有人有更好的想法,我现在就把它打开。
最终,唯一的方法是在运营层面使用政策。您可以使用validate-jwt
检查特定声明,您可以检查作为请求的一部分传递给您的其他一些凭据。或者您可以使用send-request
来调用其他服务并请求用户权限。在APIM本身中除了一些基本信息之外没有地方存储任何用户相关数据,因此这些授权信息需要来自APIM之外。
最后似乎没有内置的解决方案。滚动您自己的权限模型,然后自己验证它是要走的路。
然而...
这仍然可以在APIM中完成。正如我在第二次更新中提到的,我能够使自定义解决方案工作。它的完成方式是在“所有操作”级别使用入站策略来检索权限。 (使用了一种缓存机制,以便不在每次调用时检索权限。)然后,每个操作根据传入的参数确定用户是否具有该特定操作的权限。(这也是缓存的。)
结果是根API没有内置的身份验证或授权,但是APIM会执行,并且会观察到相应的行为。
不过,偏好是RBAC方法。例如,假设在此角色定义中将各个操作视为服务:
{
"Name": "{rolename}",
"Id": "{roleid}",
"IsCustom": true,
"Description": "{roledescription}",
"Actions": [
"GET {myapi}/owner/{ownerid}/*",
"POST {myapi}/owner/{ownerid}/*",
],
"NotActions": [],
"DataActions": [],
"NotDataActions": [],
"AssignableScopes": [
"/subscriptions/{subscriptionid}"
]
}
如果可能,我们可以创建角色,在订阅级别将它们分配给用户/组,然后将声明自动传递到APIM,在那里可以像任何其他声明一样评估它们。