首页 > 解决方案 > URL 中的 ServiceStack 会话 ID

问题描述

美好的一天,我对这个话题不太熟悉,如果没有以最好的方式解释,请原谅。我使用 ServiceStack 作为我的后端 API 并启用了“AllowSessionIdsInHttpParams = true”。我通过我的网址传递 ss-id。我注意到我可以复制该 ss-id 并在不同的客户端(浏览器)中使用。ss-id 是否应该不针对用户代理/客户端进行验证,并且仅在客户端相同时才进行验证?

后端代码

            //Configure Host
            SetConfig(new HostConfig
            {
                DebugMode = false,
                AllowSessionIdsInHttpParams = false,
                UseSecureCookies = true,
                UseSameSiteCookies = true, 
                AllowNonHttpOnlyCookies = true
            });

            // Plugins
            Plugins.Add(new CorsFeature(AppConfig.allowedOrigins, "GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD", "Content-Type, Authorization, Accept, X-ss-id", true));

前端

     var instance = axios.create({
        baseURL: Vue.prototype.$AppConfig.URL_API,
        withCredentials: true,
 })

设置后端和前端都是 HTTPS。设置 allowedOrigins 而不是通配符 (*) 如果我使用它会给出不同的问题。

错误:401 -

标签: c#.nethttpservicestack

解决方案


如果不针对用户代理/客户端验证 ss-id

不,cookie 用于识别会话,因为它是具有高熵的唯一 id,是 HTTP 客户端发送的最不可预测的标识符。它与其他承载令牌(例如 JWT 令牌或 API 密钥)没有太大区别,它们按原样验证承载,即无需额外的用户代理验证。

针对用户代理进行验证只是一种常见的、高度可预测和可欺骗的安全剧院,即如果他们能够从 HTTP 标头访问您的 Cookie,他们也可以访问所有其他 HTTP 标头。

您可以根据 IP 地址对其进行验证,但这会在网络更改时中断会话,例如,每当设备漫游 Wifi 点时,这就是通常不完成的原因。

为了最好地保护您的 cookie,它们应该仅通过 SSL 作为Secure 和 HTTP Only Cookies 发送(即ServiceStack中的默认值):

SetConfig(new HostConfig {
    UseSecureCookies = true,
    UseHttpOnlyCookies = true,
});

对于 CSRF 的额外保护,您可以启用SameSite Cookies

SetConfig(new HostConfig {
    UseSameSiteCookies = true,
});

尽管这可能会破坏跨站点功能和 Twitter OAuth 等第 3 方 OAuth 提供程序,但Lax默认设置为。


推荐阅读