我有几个API(“A组和B组”),它们调用单个中央API(“API X”)。所有都使用Azure AD进行身份验证。
在“API X”中,我想将一些路由限制为可用路由的子集。
/api/stuffForEveryOne/... <-- Group A and B should be able to call this
/api/specialStuff/... <-- Only Group B should be able to call this
实现这个的正确方法是什么?
我的想法是将AAD应用程序分配给AAD组,并通过查询“API X”中的图形API进行验证。但由于这个上下文没有用户,我不确定这是否是正确的方法。 理想情况下,如果“B组”在为“API X”请求JWT令牌时获得额外声明,那将是很好的。但我不知道这是否可行。 “A组”不应该得到这种说法。
答案 0 :(得分:2)
使用应用权限:)
您可以像这样在API X清单中定义两个应用权限(示例显示一个,为清晰起见删除了其他属性):
{
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Read all todo items",
"id": "f8d39977-e31e-460b-b92c-9bef51d14f98",
"isEnabled": true,
"description": "Allow the application to read all todo items as itself.",
"value": "Todo.Read.All"
}
]
}
将value
设置为对您有意义的内容,它将包含在访问令牌中。
示例令牌(删除了大多数声明):
{
"appid": "28d6c0d7-6017-42f7-8cee-c27d80bb9709",
"roles": [
"Todo.Read.All"
]
}
您可以在我的博客中详细了解它们:https://joonasw.net/view/defining-permissions-and-roles-in-aad。
然后,您使用AAD中的API X转到您的两个应用,并且在其中一个中需要两个应用权限,而另一个中只需要一个权限。 不要忘记授予权限。
然后,您可以添加需要存在类型为"roles"
/ ClaimTypes.Role
的声明的授权策略(我忘记它是哪一个),以及应用权限中值的值。< / p>
政策定义示例:
services.AddAuthorization(o =>
{
o.AddPolicy("SpecialStuff", p => p.RequireClaim(ClaimTypes.Role, "SpecialStuff.Read"));
});
然后在您需要权限的控制器或操作上指定[Authorize("PolicyName")]
。
旁注:我真的应该写一篇关于在ASP.NET Core API中做这些事情的博客。