Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure active directory 重置密码REST调用使用服务主体返回403_Azure Active Directory_Microsoft Graph Api_Azure Ad Graph Api - Fatal编程技术网

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

Azure active directory 重置密码REST调用使用服务主体返回403,azure-active-directory,microsoft-graph-api,azure-ad-graph-api,Azure Active Directory,Microsoft Graph Api,Azure Ad Graph Api,我试图使用发给服务主体而不是AD用户的承载令牌执行以下API。是的,我知道这是广告图与Microsoft Graph端点,但我有我的理由:) 尽管我已将“Microsoft Azure Active Directory”(和Microsoft Graph)的所有应用程序权限授予该主体,但我还是收到了403错误。我还在门户中应用了管理员同意(通过授予权限)。请注意,读取所有用户的请求(即从上面的URL中删除最后一个GUID)不会成功 承载令牌包含以下七个声明(奇怪的是,在AD中,授予了八个权限)

我试图使用发给服务主体而不是AD用户的承载令牌执行以下API。是的,我知道这是广告图与Microsoft Graph端点,但我有我的理由:)

尽管我已将“Microsoft Azure Active Directory”(和Microsoft Graph)的所有应用程序权限授予该主体,但我还是收到了403错误。我还在门户中应用了管理员同意(通过授予权限)。请注意,读取所有用户的请求(即从上面的URL中删除最后一个GUID)不会成功

承载令牌包含以下七个声明(奇怪的是,在AD中,授予了八个权限):

代币是通过以下方式获得的:

 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图形浏览器,它会工作。在这种情况下,我是以用户身份登录的。在比较令牌(scp)中的作用域时,存在差异(因为用户具有某些“用户”作用域),但没有立即看起来可疑的内容。
Directory.AccessAsUser.All
在用户范围内,但不在应用程序标识范围内,但这对我来说是有意义的,除非我尝试的操作(错误地?)需要该范围

你知道我错过了什么吗?是否有将所需的作用域/角色映射到实际API操作的引用?SP是否像用户需要的那样需要目录角色?

如前所述,授予应用程序重置用户密码的权限不是一个好主意。但如果您没有其他选择,您仍然可以使用客户端凭据流来实现这一点但除非您没有其他选择,否则不建议这样做。

解决方案:

您可以将
公司管理员
角色分配给您的服务负责人。你可以参考做那件事

  • 使用AAD Powershell连接AAD:
  • Connect AzureAD

  • 获取公司管理员的角色:
  • $role=Get AzureADDirectoryRole | Where对象{$\uu0.displayName-eq'Company Administrator'}

  • 将角色分配给您的SP:

  • 添加AzureADDirectoryRoleMember-ObjectId$role.ObjectId-ReObjectId$yoursp.ObjectId

    实际上,由于凭证流,这是不可能的,这是正确的。这在一定程度上是因为上下文中没有使用客户端凭据的
    用户
    ,并且允许它执行更改密码之类的操作,这将允许应用程序基本上劫持一个帐户,同时模糊执行者的身份。
     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);