C# 如何在ASP.NET Core 2.1网站上启用HttpOnly Cookie
我在VisualStudio中使用File->New Project创建了一个标准的ASP.NET Core MVC网站,其核心版本为2.1 在Startup.cs中是样板代码C# 如何在ASP.NET Core 2.1网站上启用HttpOnly Cookie,c#,asp.net-core,.net-core,asp.net-core-mvc,C#,Asp.net Core,.net Core,Asp.net Core Mvc,我在VisualStudio中使用File->New Project创建了一个标准的ASP.NET Core MVC网站,其核心版本为2.1 在Startup.cs中是样板代码 public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // Th
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
public void配置服务(IServiceCollection服务)
{
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
options.checkApprovered=context=>true;
options.MinimumSameSitePolicy=SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
//此方法由运行时调用。使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
}
当我浏览网站时,当我接受cookiepolicy时,会有一个.AspNet.approvement cookie。默认情况下,它被标记为安全的,但不只是httponly
如何仅在所有Cookie上启用HttpOnly
谢谢。同意cookie不仅仅是因为它是通过JavaScript在客户端设置的。您可以在
\u CookieConsentPartial.cshtml
中找到代码:
<script>
(function () {
var button = document.querySelector("#cookieConsent button[data-cookie-string]");
button.addEventListener("click", function (event) {
document.cookie = button.dataset.cookieString;
}, false);
})();
</script>
(功能(){
var按钮=document.querySelector(“#cookieConsent按钮[数据cookie字符串]”;
按钮。addEventListener(“单击”),函数(事件){
document.cookie=button.dataset.cookieString;
},假);
})();
如果您需要一个HttpOnly cookie,您应该自己在中间件或控制器中实现同意逻辑,并使用常规表单(例如POST请求)。您尝试过这个吗
services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(10);
});
手动设置cookie时(例如,针对HTTPContext),有一个简单的CookieOptions对象,您可以使用它将HttpOnly设置为true。它最终看起来有点像这样:
HttpContext.Response.Cookies.Append(
"CookieKey",
"CookieValue",
new CookieOptions
{
HttpOnly = true
});
微软有一个使用cookies进行身份验证的中间件。如果要在应用程序中使用它,请将其添加到startup.cs的Configure方法中
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvc();
app.UseCookieAuthentication();
}
如果以这种方式使用CookieAuthentication,则默认情况下将使用。有关更多详细信息,请参阅谢谢,我已经阅读了该网站,但没有得到任何有用的建议。我认为这是最好的答案。似乎唯一的方法是连接到微软的cookie中间件,并在他们的cookie上设置HttpOnly。这不是对所问问题的最佳答案,但它是用“同意”cookie解决特定问题的最佳方法,就像最近在Chrome 80上发生的那样。