AAD的服务授权

时间:2018-05-09 19:17:52

标签: azure asp.net-web-api azure-active-directory

我有几个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组”不应该得到这种说法。

1 个答案:

答案 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中做这些事情的博客。