我正在尝试使用颁发给服务主体而不是AD用户的持有者令牌来执行以下API。是的我知道这是AD Graph与Microsoft Graph端点,但我有我的理由:)
https://graph.windows.net/GUID-REDACTED/users/GUID-REDACTED?api-version=1.6
尽管我已经将“Windows Azure Active Directory”(和Microsoft Graph)的所有应用程序权限授予该主体,但我收到403错误。我还在门户网站中应用了管理员同意(通过授予权限)。请注意,读取所有用户的请求(即,删除上面的URL的最后一个GUID)是否成功。
持票人令牌包含以下七项索赔(奇怪地在AD中,授予了EIGHT权限):
"Device.ReadWrite.All",
"Directory.Read.All",
"Member.Read.Hidden",
"Directory.ReadWrite.All",
"Domain.ReadWrite.All",
"Application.ReadWrite.OwnedBy",
"Application.ReadWrite.All"
该令牌是通过以下方式获得的:
var context = new AuthenticationContext($"https://login.microsoftonline.com/{tenantId}");
var m = new HttpRequestMessage()
var accessToken = context.AcquireTokenAsync("https://graph.windows.net", credentials).Result.AccessToken;
m.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
我通过Microsoft Graph端点尝试了这种模拟方法,但使用ADAL AuthenticationContext
并得到相同的403结果。如果我使用Microsoft Graph Explorer,它可以工作。在那种情况下,我以用户身份登录。在比较令牌(scp)中的范围时,存在差异(因为用户具有某些“用户”范围),但没有任何立即看起来可疑。
Directory.AccessAsUser.All
在用户范围内但不在应用程序标识范围内,但这对我来说是有意义的,除非该范围(错误地?)是我正在尝试的操作所必需的。
我在这里缺少什么想法?是否有引用将实际API操作所需的范围/角色映射到? SP是否需要目录角色,就像用户需要的那样?
答案 0 :(得分:0)
正如@MarcLaFleur所说,赋予应用程序权限以重置用户密码并不是一个好主意。但是,如果您没有其他选择,您仍然可以使用客户端凭据流来实现此目的。 但除非您没有其他选择,否则不会推荐。
<强>解决方案:强>
您可以将Company Administrators
角色分配给您的服务主体。您可以参考this document来执行此操作。
Connect-AzureAD
$role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq 'Company Administrator'}
Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $yoursp.ObjectId