如何重命名 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 名称的主要内容,如果未能解决你的问题,请参考以下文章