重置密码REST调用使用服务主体返回403

时间:2018-05-10 02:41:06

标签: azure-active-directory microsoft-graph azure-ad-graph-api

我正在尝试使用颁发给服务主体而不是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是否需要目录角色,就像用户需要的那样?

1 个答案:

答案 0 :(得分:0)

正如@MarcLaFleur所说,赋予应用程序权限以重置用户密码并不是一个好主意。但是,如果您没有其他选择,您仍然可以使用客户端凭据流来实现此目的。 但除非您没有其他选择,否则不会推荐。

<强>解决方案:

您可以将Company Administrators角色分配给您的服务主体。您可以参考this document来执行此操作。

  1. 使用AAD Powershell连接AAD:
  2. Connect-AzureAD

    1. 获得公司管理员的职责:
    2. $role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq 'Company Administrator'}

      1. 将角色分配给您的SP:
      2. Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $yoursp.ObjectId