Google Code Prettify

ASP.NET Core 中要如何設定 Cookie 安全使用? 及如何保存及移除Cookie?

在 ASP.NET Core 中,為了安全地使用 Cookie,需要正確地配置 Cookie 的屬性,並且在保存 和移除 Cookie 時要遵循最佳實踐。以下是一些設定 Cookie 安全性和保存及移除 Cookie 的方法。


設定 Cookie 安全性

  1. Secure: 確保 Cookie 只通過 HTTPS 傳輸。
  2. HttpOnly: 防止 JavaScript 訪問 Cookie,有助於減少 XSS 攻擊風險。
  3. SameSite: 防止 CSRF 攻擊。
  4. Expiration: 設置 Cookie 的過期時間。



在 ASP.NET Core 中,可以在 Startup.cs 中配置 Cookie 安全性:

csharp


public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            options.Cookie.HttpOnly = true;
            options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 僅在 HTTPS 上傳輸
            options.Cookie.SameSite = SameSiteMode.Strict; // 嚴格的 SameSite 策略
            options.Cookie.Name = "YourCookieName";
            options.ExpireTimeSpan = TimeSpan.FromMinutes(60); // 設置過期時間
            options.SlidingExpiration = true; // 滑動過期時間
        });

    services.AddControllersWithViews();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}



保存 Cookie
在 ASP.NET Core 中保存 Cookie 可以使用 HttpContext.Response.Cookies.Append 方法。

csharp


public IActionResult SetCookie()
{
    var cookieOptions = new CookieOptions
    {
        HttpOnly = true,
        Secure = true,
        SameSite = SameSiteMode.Strict,
        Expires = DateTimeOffset.UtcNow.AddMinutes(60) // 設置過期時間
    };

    Response.Cookies.Append("YourCookieName", "YourCookieValue", cookieOptions);

    return Ok();
}



移除 Cookie
可以使用 HttpContext.Response.Cookies.Delete 方法移除 Cookie。

csharp


public IActionResult RemoveCookie()
{
    Response.Cookies.Delete("YourCookieName");
    return Ok();
}



讀取 Cookie
可以使用 HttpContext.Request.Cookies 讀取 Cookie。

csharp


public IActionResult ReadCookie()
{
    if (Request.Cookies.TryGetValue("YourCookieName", out string cookieValue))
    {
        return Ok(new { CookieValue = cookieValue });
    }

    return NotFound();
}




完整範例
以下是一個完整的控制器範例,包含設置、讀取和刪除 Cookie 的方法。

csharp


using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using System;

public class CookieController : Controller
{
    [HttpPost]
    public IActionResult SetCookie()
    {
        var cookieOptions = new CookieOptions
        {
            HttpOnly = true,
            Secure = true,
            SameSite = SameSiteMode.Strict,
            Expires = DateTimeOffset.UtcNow.AddMinutes(60)
        };

        Response.Cookies.Append("YourCookieName", "YourCookieValue", cookieOptions);

        return Ok();
    }

    [HttpGet]
    public IActionResult ReadCookie()
    {
        if (Request.Cookies.TryGetValue("YourCookieName", out string cookieValue))
        {
            return Ok(new { CookieValue = cookieValue });
        }

        return NotFound();
    }

    [HttpPost]
    public IActionResult RemoveCookie()
    {
        Response.Cookies.Delete("YourCookieName");
        return Ok();
    }
}




總結
  1. Secure 和 HttpOnly 屬性確保 Cookie 的傳輸和訪問安全。
  2. SameSite 屬性可以防止 CSRF 攻擊。
  3. 使用 HttpContext.Response.Cookies.Append 保存 Cookie,並設置適當的選項以確保安全。
  4. 使用 HttpContext.Response.Cookies.Delete 刪除 Cookie。
  5. 使用 HttpContext.Request.Cookies 讀取 Cookie 的值。
  6. 通過正確的配置和管理 Cookie,可以顯著提高應用程序的安全性。