在 ASP.NET Core 中,為了安全地使用 Cookie,需要正確地配置 Cookie 的屬性,並且在保存
和移除 Cookie 時要遵循最佳實踐。以下是一些設定 Cookie 安全性和保存及移除 Cookie 的方法。
設定 Cookie 安全性
- Secure: 確保 Cookie 只通過 HTTPS 傳輸。
- HttpOnly: 防止 JavaScript 訪問 Cookie,有助於減少 XSS 攻擊風險。
- SameSite: 防止 CSRF 攻擊。
- 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();
}
}
總結
- Secure 和 HttpOnly 屬性確保 Cookie 的傳輸和訪問安全。
- SameSite 屬性可以防止 CSRF 攻擊。
- 使用 HttpContext.Response.Cookies.Append 保存 Cookie,並設置適當的選項以確保安全。
- 使用 HttpContext.Response.Cookies.Delete 刪除 Cookie。
- 使用 HttpContext.Request.Cookies 讀取 Cookie 的值。
- 通過正確的配置和管理 Cookie,可以顯著提高應用程序的安全性。