SPO 提供程序托管的客户端 Web 部件不存储会话 cookie

Posted

技术标签:

【中文标题】SPO 提供程序托管的客户端 Web 部件不存储会话 cookie【英文标题】:SPO Provider hosted Client web part not storing session cookie 【发布时间】:2020-05-26 14:40:06 【问题描述】:

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

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

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

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

我还发现SPCacheKey cookie 在这两种情况下都被存储,只有在通过应用程序 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>

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

从源 https://providerhosted.domain 访问 https://tenant.sharepoint.com 的 xmlhttprequest 被 cors 策略禁止访问

为什么通过应用程序 webpart 加载时没有存储 ASP.NET 会话 ID cookie? 请帮忙

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于SPO 提供程序托管的客户端 Web 部件不存储会话 cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 SPFx Web 部件内显示库视图

如何从托管在另一台服务器上的 Web 应用程序调用客户端计算机托管的 Wcf 服务?

从 azure web 应用程序提供 logstash。如何?

具有多个 Web 部件实例的 SharePoint Web 部件存储在同一页面上

基于 Matlab 的点网应用程序的托管服务提供商

内容查询 Web 部件在没有 Web 部件区域的情况下不显示