ASP.NET でCookieに Secure 属性、SameSite=None 属性を付与する - ASP.NET
ASP.NET でCookieに Secure 属性、SameSite=None 属性を付与するコードを紹介ます。
ASP.NET (.NET Framework) アプリケーションの場合
ASP.NET (.NET Framework)アプリケーションの場合のコードを紹介します。
コード
下記Webフォームを作成します。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspNetCookieSameSite.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
CookieのSameSite属性テストページ
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AspNetCookieSameSite
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Cookies["SameSiteTest"].Value = HttpUtility.UrlEncode("Penguin Jump");
Response.Cookies["SameSiteTest"].HttpOnly = false;
Response.Cookies["SameSiteTest"].Secure = true;
Response.Cookies["SameSiteTest"].SameSite = System.Web.SameSiteMode.None;
}
}
}
解説
.NET Framework 4.7.2 以降では HttpCookie オブジェクトに
SameSite
プロパティが追加されているため、
SameSite
プロパティを設定することで、
SameSite属性を設定できます。
SameSite プロパティに設定できる値は下記です。
SameSiteMode の値値 | 数値の値 | 意味 |
Lax | 1 | SameSite=Lax の設定になります。top-level navigationで、かつ GETメソッドであれば、他のドメインへのリクエストであってもCookieを送信します。POSTメソッドのフォーム、imgタグ、iframe、XMLHttpRequests などによる他ドメインへのリクエストにはCookieは送信されません。 |
None | 0 | SameSite=None の設定になります。従来通りのCookieの送信動作になります。 |
Strict | 2 | SameSite=Strict の設定になります。他のドメインへのリクエストを送る際にはCookieは送信されません。
|
Cookieのレスポンス設定時にSameSite プロパティを指定して、SameSite属性、Secure属性を設定します。
Response.Cookies["SameSiteTest"].Value = HttpUtility.UrlEncode("Penguin Jump");
Response.Cookies["SameSiteTest"].HttpOnly = false;
Response.Cookies["SameSiteTest"].Secure = true;
Response.Cookies["SameSiteTest"].SameSite = System.Web.SameSiteMode.None;
実行結果
上記のプロジェクトを実行し、Webフォームにアクセスします。
[開発者ツール]を表示します。[ネットワーク]タブでアクセス時のCookieの情報を確認します。レスポンスで設定した"SameSiteTest"の値の[Secure]の列にチェックが付いていることが確認できます。
Cookieの値はコードで記述した"Penguin Jump"が設定されています。
また、[SameSite]の列の値が"None"になっていることも確認でき、SameSite と Secure 属性が設定できていることが確認できます。
ASP.NET 5 (ASP.NET Core)アプリケーションの場合
ASP.NET Core (.NET 5)アプリケーションの場合のコードを紹介します。
コード
Index Razorページを作成します。また、Startup.cs ファイルを記述します。
@page
@model AspNetCoreCookieSameSite.Pages.IndexModel
@{
}
<html>
<head>
<title>Cookie Test</title>
</head>
<body>
CookieのSameSite属性テストページ
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace AspNetCoreCookieSameSite.Pages
{
public class IndexModel : PageModel
{
public void OnGet()
{
Microsoft.AspNetCore.Http.CookieOptions options = new Microsoft.AspNetCore.Http.CookieOptions();
options.MaxAge = new TimeSpan(365, 0, 0, 0);
options.Secure = true;
options.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
HttpContext.Response.Cookies.Append("SameSiteTest", "White-Bear", options);
}
}
}
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace AspNetCoreCookieSameSite
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
}
解説
ASP.NET Core の場合は、RazorPages のOnGetイベントでCookieのレスポンスを設定します。Cookieのれス本巣のオプションはCookieOptions オブジェクトに設定します。
CookieOptionsオブジェクトの Secure プロパティを設定してSecure属性の値を設定します。また、SameSite プロパティでSameSite属性を設定できます。
Microsoft.AspNetCore.Http.CookieOptions options = new Microsoft.AspNetCore.Http.CookieOptions();
options.MaxAge = new TimeSpan(365, 0, 0, 0);
options.Secure = true;
options.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
HttpContext.Response.Cookies.Append("SameSiteTest", "White-Bear", options);
SameSite プロパティに設定できる値は次の通りです。
SameSiteMode の値値 | 数値の値 | 意味 |
Lax | 1 | SameSite=Lax の設定になります。top-level navigationで、かつ GETメソッドであれば、他のドメインへのリクエストであってもCookieを送信します。POSTメソッドのフォーム、imgタグ、iframe、XMLHttpRequests などによる他ドメインへのリクエストにはCookieは送信されません。 |
None | 0 | SameSite=None の設定になります。従来通りのCookieの送信動作になります。 |
Strict | 2 | SameSite=Strict の設定になります。他のドメインへのリクエストを送る際にはCookieは送信されません。
|
Unspecified | -1 | SameSite属性を設定しません。
|
実行結果
プロジェクトを実行し、
(アプリケーションルート)/index
のURLにアクセスします。index.cshtml ページが表示され、下図の画面が表示されます。
[開発者ツール]を表示します。[ネットワーク]タブでアクセス時のCookieの情報を確認します。
レスポンスで設定した"SameSiteTest"の値の[Secure]の列にチェックが付いていることが確認できます。
Cookieの値はコードで記述した"White-Bear" の値が設定されています。
また、[SameSite]の列の値が"None"になっていることも確認でき、SameSite と Secure 属性が設定できていることが確認できます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用