【问题标题】:Graph API POST Request (Create List Item) 'accessDenied' error for Guest AD Users来宾 AD 用户的图形 API POST 请求(创建列表项)“accessDenied”错误
【发布时间】:2021-08-26 09:40:09
【问题描述】:

我有一个很奇怪的问题(我想是的)...我正在使用 Ionic Angular 构建一个 Web 应用程序,该应用程序需要向我们公司内的 SharePoint 网站提交信息。应用程序的身份验证使用Microsoft Authentication Library for Angular (v1) 处理,应用程序的用户可以是 AzureAD 来宾用户,也可以是实际的公司用户。该应用程序成功地验证了这两种类型的用户,并为他们颁发了一个 IDtoken 以及一个 accessToken。然后使用访问令牌对 SharePoint 网站中的特定列表执行 GET、PATCH 和 POST Graph API 请求。

如果我以完整用户身份登录...没有问题,应用程序可以成功地针对列表执行所有三种请求类型。但是,如果我以访客用户身份登录应用程序,我只能成功执行 GET 和 PATCH 请求,而不能成功执行 POST:

A Postman POST request using the access token retrieved via MSAL authentication

我已使用 https://jwt.ms 检查令牌内的范围,并确认存在以下范围:

  • Sites.Manage.All
  • Sites.Read.All
  • Sites.ReadWrite.All
  • User.Read profile openid email

列表的权限是通过 Azure AD 域/安全组和两者的成员身份授予的;完整用户和来宾用户都是成员。

为了进一步补充这一点,我已经以访客用户身份在线登录到 SharePoint 网站,我可以成功地查看、添加和编辑列表中的列表项,但我似乎无法通过 Graph API 执行此操作.

以前有没有人见过这种行为,或者有任何指示?

提前致谢。

这是我关于权限的应用注册设置: API Permissions

【问题讨论】:

    标签: azure-active-directory microsoft-graph-api sharepoint-online


    【解决方案1】:

    请在 Azure 门户中检查您的权限。使用登录用户获取访问令牌时,您需要确保已为您的租户设置委派权限Sites.ReadWrite.All,并授予管理员同意

    并且范围应该添加这个请求访问令牌的权限。

    POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token 
    
    client_id=<client_id>
    &scope=https%3A%2F%2Fgraph.microsoft.com%2FSites.ReadWrite.All
    &code=<authorization_code, see https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code>
    &redirect_uri=<redirect_uri>
    &grant_type=authorization_code
    &code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong 
    &client_secret=<client_secret>
    

    添加权限后可能会延迟5-10分钟左右。

    【讨论】:

    • 您好,感谢您的建议。不幸的是,情况已经如此,我似乎无法在此评论中提供图片,因此将用它更新问题。应用注册具有以下委托权限,每个委托权限均由另一个 Azure 管理员为组织授予:Sites.Manage.All、Sites.ReadWrite.All、Sites.Read.All、User.All
    • 另外,当通过 MSAL 触发身份验证流程时,这是 URL:https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize ?response_type=id_token &amp;scope=user.read%20openid%20profile%20sites.readwrite.all%20sites.manage.all &amp;client_id=&lt;client_id&gt; &amp;redirect_uri=http%3A%2F%2Flocalhost%3A8100%2Floading &amp;state=&lt;state&gt; &amp;nonce=&lt;nonce&gt; &amp;client_info=&lt;client_info&gt; &amp;client-request-id=&lt;lient-request-id&gt; &amp;response_mode=fragment
    • 如 url 所示,您使用 implicit flowresponse_type=id_token 表示获取 id_token 但不获取访问令牌,请尝试使用 response_type=token
    • 是的,你是对的,但是我使用的 MSAL 库会自动为我检索具有定义范围的 accessToken,我不会手动调用这些授权/令牌 URL。当我检查成功登录/身份验证的有效负载时。我可以看到检索到的 idTokenaccessToken 。当我通过 jwt.ms 检查 accessToken 时,我可以看到定义的范围。所以我希望令牌对于 Graph 资源是有效且可用的(实际上是用于 GET 和 PATCH)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多