SPO 提供商托管的客户端 Web 部件未存储 session cookie

SPO Provider hosted Client web part not storing session cookie

我有一个提供商托管的应用程序,它使用 SharePoint 上下文筛选器对用户进行身份验证。我将第一个请求中生成的上下文令牌存储在 session 变量中,并在后续调用中使用它。

当我点击网站内容中的应用程序并被重定向到提供商托管的应用程序时,一切正常。

但是当我导航到 SharePoint Online 中的一个页面时,该页面的客户端 Web 部件托管在提供商托管的应用程序中,session 不起作用。

在检查应用程序 webpart 和应用程序直接打开时发送的请求 headers 时,我发现 ASP.NET_SessionId cookie 没有存储在应用程序 webpart 中,而是在提供商托管时应用直接导航。

我还发现 SPCacheKey cookie 仅在两种情况下存储 Session 通过应用程序 Web 部件加载时 cookie 未存储。

我在 Chrome 和 IE 中对此进行了测试,两者都给出了相同的输出。

我尝试按照此 link

修改 web.config
  <system.webServer>    
    <httpProtocol>
      <customHeaders>
        <add name="p3p" value="CP=&quot;IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT&quot;"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>

但是并没有解决问题。由于 session 未被存储,我的提供商托管应用程序中的每个 ajax 调用都被重定向到 appredirect.aspx 并抛出

Access to xmlhttprequest at https://tenant.sharepoint.com from origin https://providerhosted.domain blocked by cors policy no access

为什么在通过应用 Web 部件加载时 ASP.NET Session Id cookie 没有被存储? 请帮助

在 google 中使用许多不同的关键字搜索此问题的解决方案后,终于找到了解决方案。看起来这是一个 Iframe 问题。当应用 Web 部件加载到 iframe 中时,会话 cookie 不会存储在 iframe 中。

根据这个 answer and this link,在 web.configsessionState 中添加 cookieSameSite=None 属性解决了这个问题。

<sessionState cookieSameSite="None"  cookieless="false" timeout="360"> 
</sessionState>

像往常一样,这是由 MS 的更新版本引起的,它将会话 cookie 的 cookieSameSite 属性的默认值从 None 更改为 Lax