如何在servicestack中重命名默认会话cookie名称

时间:2016-10-21 13:49:46

标签: c# security cookies servicestack session-cookies

ServiceStack具有默认的cookie名称 在SessionFeature.cs中定义的“ss-id”“ss-pid”和“ss-opt”

有没有办法将默认名称更改为其他名称?

HostConfig中的配置代码似乎没有引用它。

非常感谢任何提示/指示。

2 个答案:

答案 0 :(得分:4)

正如您在SessionFeature.cs代码中所述,Cookie名称定义为const,并且不是用户可配置的。

但是,您可以使用过滤器将Cookie名称更改为更适合请求和响应的内容。添加到您的配置方法:

const string mySessionIdentifier = "mySessionId";

// Converts incoming requests with "mySessionId" cookie to "ss-id"
PreRequestFilters.Add((IRequest httpReq, IResponse httpRes) =>
{
    var cookie = httpReq.Cookies[mySessionIdentifier];
    if (cookie != null)
    {
        httpReq.Cookies.Remove(mySessionIdentifier);
        httpReq.Cookies.Add(ServiceStack.Keywords.SessionId, cookie);
    }
}


// Converts responses with outgoing cookie "ss-id" to "mySessionId"
GlobalResponseFilters.Add((IRequest httpReq, IResponse httpRes, object dto) => {
    var cookies = httpRes.CookiesAsDictionary();
    string cookie;
    if (cookies.TryGetValue(ServiceStack.Keywords.SessionId, out cookie))
    {
        httpRes.DeleteCookie(ServiceStack.Keywords.SessionId);
        httpRes.SetCookie(new Cookie(mySessionIdentifier, cookie));
    }
});

你也可以suggest here这是可配置的。

答案 1 :(得分:1)

可配置cookie名称的另一个案例是,您可能在domain.com上说MVC站点,在api.domain.com上说api。如果您同时利用servicestack的会话功能(但具有单独的登录),则ss-id等cookie将在两个站点上相互争斗。在IE和Edge中就是这种情况,其中域和子域cookie始终是共享的,而在Chrome中,cookie保持独立。

我们有这样的配置 - domain.com上的MVC网站,以及托管api的各种子域,用于我们应用的各种变体。只要有人使用IE而不是Chrome,就会破坏MVC网站和子域之间的cookie。

不幸的是,上面的过滤器解决方案不适用于servicestack MVC集成。我们从domain.com切换到www.domain.com为时已晚,因此我们目前无法在MVC网站上享受servicestack的会话存储。

我已请求更改功能。