所以我的要求是在Azure机器上运行的应用程序检查登录的特定Azure用户是否属于指定的Azure组。
我已为所述虚拟机启用了托管服务标识。 MSI
我通过使用以下命令调用VM上的图形资源来调用本地运行的元数据服务来获取VM的令牌:
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fgraph.windows.net' -H Metadata:true
获得令牌后,我使用新获得的令牌向isMemberOf的图形API发出POST请求:
curl -i -H "Authorization: Bearer <token-value>" -H "Content-Type: application/json" --data '{"groupId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","memberId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}' https://graph.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/isMemberOf?api-version=1.6
我得到以下回复
{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."}}}
我已将VM所属的资源组分配给IAM作为资源的所有者
我错过了我应该配置的东西,或者我在这里做错了什么?
答案 0 :(得分:2)
所以我稍微挖了一下,发现微软更喜欢使用Microsoft Graph而不是Azure AD Graph的开发人员 Microsoft Graph vs Azure AD Graph
我在Microsoft Graph API中发现了一个类似的调用来获取信息成员User list member of call 此调用需要以下scope:
Directory.Read.All
Directory.ReadWrite.All
这些是我遵循的步骤:
POST https://login.microsoftonline.com/ {tenant-id} /oauth2/v2.0/token
HEADER 内容类型:application / x-www-form-urlencoded
BODY: CLIENT_ID =安培;范围= HTTPS%3A%2F%2Fgraph.microsoft.com%2F.default&安培; client_secret =安培; grant_type = client_credentials
回应:
{
"token_type": "Bearer",
"expires_in": 3600,
"ext_expires_in": 0,
"access_token": "<token-value>"
}
客户端密码是在应用注册时生成的。
POST https://graph.microsoft.com/v1.0/users/ {user-object-id} / checkMemberGroups
标题:授权:承载{token-value} Content-Type:application / json
BODY:
{
"groupIds":["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"]
}
响应:
200 OK - 如果用户属于该组
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(Edm.String)",
"value": [
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
]
}
404未找到 - 如果用户不存在
{
"error": {
"code": "Request_ResourceNotFound",
"message": "Resource 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' does not exist or one of its queried reference-property objects are not present.",
"innerError": {
"request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"date": "2018-05-23T02:54:47"
}
}
}
这有助于应用程序识别Azure用户是否属于指定的组。
答案 1 :(得分:0)
您正在调用Azure AD Graph API,而不是ARM API。 IAM刀片仅提供ARM API的访问权限。
您需要手动为服务主体分配必要的权限。
我实际上在前一篇文章中写了一篇文章:Calling your APIs with Azure AD Managed Service Identity using application permissions。
您将需要:
获得这些后,您可以运行此PowerShell cmdlet(使用AAD v2 cmdlet):
Connect-AzureAD
New-AzureADServiceAppRoleAssignment -ObjectId msi-sp-id -Id app-permission-id -PrincipalId msi-sp-id -ResourceId aad-graph-sp-id
然后一切都应该有效。