我正在使用Azure AD来保护我的服务以进行服务调用。 (每个服务在Azure AD中具有应用程序标识)。
示例:Application A
想要访问Application B
。
我注意到,当使用客户端凭据流(带证书)请求来自Application A
的accessstoken时,会发出accessstoken,而无需我明确设置访问Application B
的权限。
这对我来说似乎很奇怪,因为返回的令牌将其受众设置为Application B
,即使我没有明确指定它也可以访问。
如果我理解正确,默认情况下所有已注册的应用都可以互相访问?
Azure AD中是否有一种方法明确要求设置权限以便应用程序相互访问?
以下是Application A
所需权限的屏幕截图。如您所见,此处未列出Application B
。
在以下屏幕截图中,我将TodoListService
(又名应用程序B)分配给Application A
所需的权限
答案 0 :(得分:1)
我注意到,当使用客户端凭据流(带证书)请求来自应用程序A的accessstoken时,会发出一个accesstoken,而无需我明确设置访问应用程序B的权限。
是的,那个可能有点令人惊讶,我也不确定为什么会这样。
您需要做的是在API上定义应用程序权限,然后在客户端上分配它。 然后,您需要检查调用者是否在令牌中具有所需的应用程序权限。
我有一篇关于这个主题的文章:Defining permission scopes and roles offered by an app in Azure AD。
要在API上定义应用程序权限,您必须在Azure AD中编辑其清单,并添加成员类型为Application的应用程序角色,如:
{
"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"
}
]
}
IIRC你必须为id生成一个GUID。 在API上定义此权限后,转到您的客户端应用程序,并在所需权限中添加应用程序权限。 然后,您应该按授予权限以授予应用程序权限。
现在,当客户端获取具有客户端凭据的令牌时,令牌将包含:
{
"roles": [
"Todo.Read.All"
]
}
因此,您必须检查是否存在。