我有一个公开自定义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://***/.default
和api://***/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/