波斯马BOSSMA Information Technology

IIS做反向代理时Cookie域的设置

发布时间:2018年4月18日 / 分类:SERVER / 6,390 次浏览 / 评论

IIS通过URL重写可以实现反向代理,通过简单的配置即可以将请求转发到其它内部站点。

此时被代理的所有站点的cookie的域(domain)会自动设置为提供反向代理功能的站点的域,这一般来说没有问题。但是在多站点共享cookie时会存在问题。

比如有一个对外的域名 proxy.fireflysoft.net,这个域名指向一个提供反向代理的站点;然后还有一个域名pay.fireflysoft.net,指向一个独立的IIS站点,提供支付服务;然后proxy.fireflysoft.net/mall 提供商城服务,用户在这里下单后支付,需要跳转到pay.fireflysoft.net;

为了在这两个站点之间实现用户状态共享,这里希望他们之间可以共享SessionID,这个值保存在cookie中,所以实际上是期望共享cookie,共享cookie可以通过设置不同站点cookie的域为相同的值来实现。

比如这里希望proxy.fireflysoft.net和pay.fireflysoft.net的cookie域值都为fireflysoft.net,这样proxy.fireflysoft.net的用户状态就可以为pay.fireflysoft.net所使用。但是这面临上边提到的反向代理站点cookie域自动设置问题。

关于这个问题,网上可以搜索到的方案大部分都是Nginx的,其实IIS的URL重写也是支持的,只不过用的人可能比较少,所以查不到什么资料。

这个解决方案是在IIS的论坛上找到的,有人问同样的问题:https://forums.iis.net/t/1193378.aspx。帖子中并没有给出直接的答案,而是参考一个使用URL重写设置cookie HttpOnly的方案:

Using the URL Rewrite module to set your cookies to HttpOnly

有兴趣的可以读一下原文,下边将直接给出解决方案。

URL重写的规则会保存到web.config中,因为设置cookie属于URL重写的出站规则,所以直接在出站规则中增加相关配置:

<rewrite>     
<outboundRules>                
<rule name="Add Domain" preCondition="No Domain">
                    <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
                    <action type="Rewrite" value="{R:0}; domain=fireflysoft.net" />
                    <conditions>
                    </conditions>
                </rule>
                <preConditions>
                    <preCondition name="No Domain">
                        <add input="{RESPONSE_Set_Cookie}" pattern="." />
                        <add input="{RESPONSE_Set_Cookie}" pattern="; domain=.*" negate="true" />
                    </preCondition>
                </preConditions>
      </outboundRules>
    </rewrite>

代码中包含两部分:

首先是前提条件preConditions:针对响应时设置cookie,且没有设置cookie domain的情况;

然后是处理规则rule:针对响应时设置的cookie,重写cookie,增加domain的设置。

这样cookie domain即设置为目标值,从而实现cookie在二级域名之间的共享。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《IIS做反向代理时Cookie域的设置

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论