URL 中的 ServiceStack 会话 ID

ServiceStack Session ID in URL

你好,我对这个话题不是很熟悉,所以如果没有以最好的方式解释,请原谅。 我使用 ServiceStack 作为我的后端 API 并启用了“AllowSessionIdsInHttpParams = true”。我正在通过我的 url 传递 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-

Should the ss-id not be validated against the user agent / client

不,cookie 用于识别 session,如果它是具有高熵的唯一 ID,则它是 HTTP 客户端发送的最不可预测的标识符。它与其他不记名令牌(例如 JWT 令牌或 API 验证不记名 as-is 的密钥没有太大区别,即无需额外的用户代理验证。

针对 User-agent 进行验证只是一个常见的、高度可预测和可欺骗的安全剧院,即如果他们能够从 HTTP Headers 访问您的 Cookie,他们也可以访问所有其他 HTTP Headers.

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

为了最好地保护您的 cookie,它们应该仅通过 SSL 作为 Secure and HTTP Only Cookies (i.e. defaults in ServiceStack):

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

为了针对 CSRF 提供额外保护,您可以启用 SameSite Cookies:

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

尽管这可能会破坏 cross-site 功能和第三方 OAuth 提供程序(如 Twitter OAuth),但它默认设置为 Lax

这不是对问题的直接回答,而是与问题相关。这是在我正在使用的技术堆栈中完成我需要完成的任务的首选和最佳解决方案。

Servicestack后端配置:

//Configure option also Host UseSameSiteCookies = true
            SetConfig(new HostConfig
            {
                UseSecureCookies = true
            });

            Plugins.Add(new CorsFeature(AppConfig.allowedOrigins, // configured Origins
                "GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD", 
                "Content-Type, Authorization, Accept", 
                true)); // allowed Credentials

UseSecureCookies 必须为真,通配符 (*) 来源无效,允许的凭据必须为真。

Axios FrontEnd(Axios 的配置实例)

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

使用实例确实有助于消除 bowlerplate 代码,withCredentials 也可以用拦截器设置,但这段代码对我来说很好。

最后,对于像我这样的新手,请不要忘记 SSL (HTTPS)。在 IIS 中,您可以轻松地为 Intranet 创建自我叹息证书我相信这已经足够了。您需要双方都使用 SSL,您的来源(前端)和服务堆栈 api(后端。)