如何强制Sitecore 10创建HttpOnly属性为True的Cookie?
问题描述
我是Sitecore新手,在新项目中需要对Cookie创建进行自定义配置。目前已通过自定义处理器将现有Cookie的HttpOnly值修改为true,但想了解是否有方法可以强制Sitecore在创建Cookie时直接将HttpOnly设为true,使用的是Sitecore 10版本。
当前已实现的配置与代码
配置补丁
<processor patch:before="processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']" type="MySCProject.Foundation.SitecoreExtensions.Pipelines.HttpRequestBegin.CookieProcessor, MySCProject.Foundation.SitecoreExtensions" />
自定义处理器代码
public class CookieProcessor : HttpRequestProcessor { public override void Process(HttpRequestArgs args) { var cookie = HttpContext.Current.Request.Cookies["shell#lang"]; if (cookie != null) { cookie.HttpOnly = true; HttpContext.Current.Response.Cookies.Add(cookie); } } }
当前Cookie状态截图

解决方案:强制Sitecore创建Cookie时默认HttpOnly为True
1. 替换默认CookieManager实现(推荐)
Sitecore的Sitecore.Web.Cookies.CookieManager是处理Cookie创建的核心类,通过替换其实现可以全局强制设置HttpOnly:
步骤1:创建自定义CookieManager类
using System.Web; using Sitecore.Web.Cookies; namespace MySCProject.Foundation.SitecoreExtensions.Cookies { public class CustomCookieManager : CookieManager { public override void SetCookie(HttpCookie cookie) { // 强制设置HttpOnly为true cookie.HttpOnly = true; base.SetCookie(cookie); } } }
步骤2:用配置补丁替换默认实现
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <services> <register serviceType="Sitecore.Web.Cookies.ICookieManager, Sitecore.Kernel" implementationType="MySCProject.Foundation.SitecoreExtensions.Cookies.CustomCookieManager, MySCProject.Foundation.SitecoreExtensions" patch:instead="*[@serviceType='Sitecore.Web.Cookies.ICookieManager, Sitecore.Kernel']" /> </services> </sitecore> </configuration>
该方式覆盖所有通过CookieManager创建的Cookie,包括系统自带的shell#lang、sc_lang等,以及自定义代码中使用CookieManager创建的Cookie。
2. 针对特定系统Cookie的配置修改
部分Sitecore系统Cookie可直接通过配置开关设置HttpOnly,比如语言Cookie:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <settings> <!-- 开启分析Cookie的HttpOnly属性 --> <setting name="Analytics.Cookie.HttpOnly" value="true" /> <!-- 开启语言Cookie的HttpOnly属性 --> <setting name="LanguageCookie.HttpOnly" value="true" /> </settings> </sitecore> </configuration>
注意:仅适用于有对应配置项的系统Cookie,无法覆盖所有场景。
3. 全局HttpModule拦截(兜底方案)
如果以上方法无法覆盖所有Cookie,可创建HttpModule在响应阶段强制设置所有Cookie的HttpOnly:
步骤1:创建HttpModule类
using System.Web; namespace MySCProject.Foundation.SitecoreExtensions.Modules { public class CookieHttpOnlyModule : IHttpModule { public void Init(HttpApplication context) { context.PostRequestHandlerExecute += Context_PostRequestHandlerExecute; } private void Context_PostRequestHandlerExecute(object sender, System.EventArgs e) { var application = (HttpApplication)sender; foreach (string cookieName in application.Response.Cookies.AllKeys) { var cookie = application.Response.Cookies[cookieName]; if (cookie != null) { cookie.HttpOnly = true; } } } public void Dispose() { } } }
步骤2:注册HttpModule到web.config
<system.webServer> <modules> <add name="CookieHttpOnlyModule" type="MySCProject.Foundation.SitecoreExtensions.Modules.CookieHttpOnlyModule, MySCProject.Foundation.SitecoreExtensions" /> </modules> </system.webServer>
该方式会强制所有响应中的Cookie设置HttpOnly,适合全局统一控制的场景。
内容的提问来源于stack exchange,提问作者Libin
相关产品推荐
相关产品推荐

