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

本文关键字:会话 cookie 名称 默认 重命名 servicestack | 更新日期: 2023-09-27 18:14:16

ServiceStack有默认的cookie名称"ss-id" "ss-pid"answers"ss-opt"在SessionFeature.cs中定义

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

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

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

正如您在sessionfunction .cs代码中所注意到的,cookie名称被定义为const,并且不是用户可配置的。

然而,你可以使用过滤器将cookie名称更改为更适合请求和响应的名称。添加到您的configure方法中:
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));
    }
});

你也可以在这里建议这是可配置的

可配置cookie名称的另一种情况是,您可能有一个MVC站点在domain.com和一个api在api.domain.com。如果你在两个站点上都利用了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的会话存储。

我已要求更改功能。