ASP.NET でCookieに Secure 属性、SameSite=None 属性を付与する - ASP.NET

ASP.NET でCookieに Secure 属性、SameSite=None 属性を付与するコードを紹介ます。

ASP.NET (.NET Framework) アプリケーションの場合

ASP.NET (.NET Framework)アプリケーションの場合のコードを紹介します。

コード

下記Webフォームを作成します。
Default.aspx
<%@ 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>
Default.aspx.cs
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 の値
数値の値意味
Lax1SameSite=Lax の設定になります。top-level navigationで、かつ GETメソッドであれば、他のドメインへのリクエストであってもCookieを送信します。POSTメソッドのフォーム、imgタグ、iframe、XMLHttpRequests などによる他ドメインへのリクエストにはCookieは送信されません。
None0SameSite=None の設定になります。従来通りのCookieの送信動作になります。
Strict2SameSite=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 ファイルを記述します。
Index.cshtml
@page
@model AspNetCoreCookieSameSite.Pages.IndexModel
@{
}
<html>
<head>
  <title>Cookie Test</title>
</head>
<body>
  CookieのSameSite属性テストページ
</body>
</html>
Index.cshtml.cs
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);

    }
  }
}
Startup.cs
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 の値
数値の値意味
Lax1SameSite=Lax の設定になります。top-level navigationで、かつ GETメソッドであれば、他のドメインへのリクエストであってもCookieを送信します。POSTメソッドのフォーム、imgタグ、iframe、XMLHttpRequests などによる他ドメインへのリクエストにはCookieは送信されません。
None0SameSite=None の設定になります。従来通りのCookieの送信動作になります。
Strict2SameSite=Strict の設定になります。他のドメインへのリクエストを送る際にはCookieは送信されません。
Unspecified-1SameSite属性を設定しません。

実行結果

プロジェクトを実行し、(アプリケーションルート)/index のURLにアクセスします。index.cshtml ページが表示され、下図の画面が表示されます。


[開発者ツール]を表示します。[ネットワーク]タブでアクセス時のCookieの情報を確認します。 レスポンスで設定した"SameSiteTest"の値の[Secure]の列にチェックが付いていることが確認できます。 Cookieの値はコードで記述した"White-Bear" の値が設定されています。 また、[SameSite]の列の値が"None"になっていることも確認でき、SameSite と Secure 属性が設定できていることが確認できます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-03-28
iPentec all rights reserverd.