具有 ACS 身份验证的 azure 开发中的跨域 cookie

Posted

技术标签:

【中文标题】具有 ACS 身份验证的 azure 开发中的跨域 cookie【英文标题】:cross domain cookies in azure development with ACS authentication 【发布时间】:2014-09-12 10:56:30 【问题描述】:

您好,我正在 Azure 上开发两个 Web 服务,分别是“domain1.azurewebsite.net”和“domain2.azurewebsite.net”。我已经在同一个 Active Directory 下的两个服务中实现了 ACS 身份验证。现在我需要通过domain1.azurewebsite.net登录,并把cookie(包含auth token)分享给domain2.azurewebsite.net,这样我就可以访问domain1中domain2的数据服务了。

我已按照在线建议设置了 cookie 域 =“.azurewebsite.net”。我希望这样的 cookie 被所有子域共享,即“* .azurewebsite.net”,这样就可以实现跨域的目的。在web.config中设置如下

<system.identityModel.services>
 <federationConfiguration>
  <cookieHandler requireSsl="false"
                 domain=".azurewebsites.net"
                 hideFromScript="false"
                 persistentSessionLifetime="0:30:0" />
  <wsFederation passiveRedirectEnabled="true"
            issuer="https://focusns.accesscontrol.windows.net/v2/wsfederation" 
                realm="urn:Focusns" 
                requireHttps="false"
                persistentCookiesOnPassiveRedirects="true" />
 </federationConfiguration>
</system.identityModel.services>

为了启用跨域请求,我使用了 CORS,并且我已经正确设置了来自“domain2.azurewebsite.net”的响应标头,如下所示:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://domain1.azurewebsites.net

但是,我的问题是登录 domain1.azurewebsite.net 时未附加具有“.azurewebsite.net”域的 cookie。当我检查 cookie 时,我什至看不到它们,当我使用 Chrome、Opera、FF 时。但我确实在 IE11 中看到了 cookie,其中一切正常。我在链接browser security handbook part 2中发现了不同浏览器之间的差异,我怀疑原因是IE不支持host-scope cookie。

无论如何,有人知道我该如何解决这个问题吗?我需要它在 Chrome、FF 等中工作。提前致谢

【问题讨论】:

【参考方案1】:

根据这个问题 Chrome34 ignores cookies with domain ".cloudapp.net",

铬 火狐 (可能是其他浏览器)

拒绝为公共共享域后缀设置 cookie(在此处列出:https://publicsuffix.org/list/effective_tld_names.dat)。和 “azurewebsites.net”就是其中之一。

IE没有这个限制,可能是因为MS拥有两者。

解决方案可能是将站点映射到您拥有的自定义域/子域名。不能在 Azure 中设置链式子域,例如“a.b.azurewebsites.net”。如果可以的话,您可以为“b.azurewebsites.net”设置 cookie,Chrome 允许这样做。

【讨论】:

看到这个禁止列表确实解决了我的问题。我不知道存在这样的禁止 cookie 域列表。

以上是关于具有 ACS 身份验证的 azure 开发中的跨域 cookie的主要内容,如果未能解决你的问题,请参考以下文章

通过 Azure 的 OpenID Connect 进行联合身份验证

使用 Windows 身份验证的跨域 SQL Server 登录

验证来自 Javascript 的跨域请求

AngularJS 中的跨域 HTTP 请求失败

阻止具有来源的框架访问 wordpress 中的跨域框架

护照Facebook登录中的“对于需要预检的跨域请求是不允许的”错误?