我有一个公开自定义API的多租户服务主体。使用MSAL.js的UserAgentApplication,我可以征求我对与loginPopup首次使用时所需的资源的同意。但是,我对于在请求中指定哪些资源感到困惑。例如,假设我使用以下弹出窗口(请注意缺少范围):



await this.userAgentApplication.loginPopup({
    prompt: 'consent',
    authority: "https://login.microsoftonline.com/organizations"
})





该应用程序将仅请求用户的个人资料。很公平。

但是,假设我将弹出窗口配置如下:



await this.userAgentApplication.loginPopup({
  scopes: ["api://xyz/Some.Scope"]
  prompt: "consent"
  authority: "https://login.microsoftonline.com/organizations"
})





这将导致异常:


  用户或管理员不同意使用名为“ XYZ”的ID为“ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx”的应用程序。发送对此用户和资源的交互式授权请求。


即使使用全局管理员帐户登录,为什么也出现此错误?

最后,除了我们自己的API数据外,我们还需要能够在应用程序上下文中读取图组,因此我使用.default端点(在服务主体注册中指定了权限)请求了它们。我使用以下弹出窗口进行了此操作:



await this.userAgentApplication.loginPopup({
    scopes: ["https://graph.microsoft.com/.default"],
    prompt: 'consent',
    authority: "https://login.microsoftonline.com/organizations"
})





上次尝试的结果是...我希望的所有权限!


  登录并阅读用户资料
  
  读写所有群组
  
  我的自定义API范围(应用程序名称)


但是,为什么我们的Graph同意请求会自动包含对其他自定义范围的请求?

最佳答案

如果您对资源使用管理员同意,这是预期的行为。

当您将***/.default设置为范围时,等同于在Azure门户中执行“ {您的租户}的授权管理员同意”。

因此,无论是否来自必需资源,它都会要求管理员同意所有必需权限。

但是,如果您设置https://graph.microsoft.com/user.read,它将要求您仅征得user.read许可。

因此,在这种情况下,一旦使用最后一个进行管理员同意,api://xyz/Some.Scope也将生效。

我还使用自定义API api://***/.defaultapi://***/user.write进行了测试,两者均按预期工作。

您也可以尝试使用以下请求进行管理员同意:

https://login.microsoftonline.com/jmaster.onmicrosoft.com/oauth2/v2.0/authorize?
client_id={client id}
&response_type=code
&redirect_uri={redirect url}
&response_mode=query
&scope=api://xyz/Some.Scope
&state=12345
&prompt=consent


请重试api://***/.default。如果它不起作用,请不要担心,因为api://xyz/Some.Scope也会在最后一个代码段中生效。

关于javascript - 同意流程如何确定要请求的资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61325973/

10-13 01:05