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

Posted

技术标签:

【中文标题】如何重命名 servicestack 中的默认会话 cookie 名称【英文标题】:How can I rename default session cookie names in servicestack 【发布时间】:2017-03-03 20:50:48 【问题描述】:

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

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

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

不胜感激任何提示/指针。

【问题讨论】:

【参考方案1】:

正如您在 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 这是可配置的。

【讨论】:

是否会导致任何性能损失,使其成为静态非 const 属性? @joelharkes 我假设你在谈论SessionFeature.cs 中的SessionId:我认为这只是const,因为没有人提出一个案例来使其可配置。所以我想它可以很容易地更改为static 属性,并且用户可以配置而不会降低性能。有几个地方 cookie id 已被烘焙到客户端和需要更新的 ServerSendEvents 功能,但如果提出建议,这种更改通常会很快发生。 我认为使其可配置的最佳情况是安全性:cookie 名称可以指示服务堆栈后端。这将使黑客更容易瞄准系统。 @joelharkes 我可以看到这个论点并认为这是一个正当的理由 - 我是为了让它可配置。请记住,ServiceStack 服务中还有许多其他内置功能会将服务器公开为 ServiceStack(默认错误页面、异常格式、默认“同步”路由、元数据、服务器标头、内置文件,例如ss-utils.js)。所以有很多方面要隐藏,这只是通过默默无闻的安全性,总会有一些方面暴露后端。 允许其可配置会破坏显式设置会话 Cookie 的客户端。就可以依赖的常量达成一致是有价值的,尤其是。当它们跨流程边界使用时。【参考方案2】:

可配置 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 的会话存储。

我已请求更改功能。

【讨论】:

以上是关于如何重命名 servicestack 中的默认会话 cookie 名称的主要内容,如果未能解决你的问题,请参考以下文章

如何从默认 Django 模型重命名模型字段?

重命名 Spring csrf 令牌变量

在 ssh 之后从命令行重命名控制台会话

重命名TortoiseHG中的默认分支

如何在 Linux 中批量移动复制追加和重命名文件

重命名默认的 Cocoapods 项目