Google Code Prettify

顯示具有 cookie 標籤的文章。 顯示所有文章
顯示具有 cookie 標籤的文章。 顯示所有文章

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

在 ASP.NET Core Razor Pages 中,設置 Cookie 安全使用、保存 Cookie 和移除 Cookie 與在 MVC 中的操作類似。以下是如何在 Razor Pages 中實現這些功能的詳細步驟。


設定 Cookie 安全使用
首先,確保你在 Startup.cs 中配置了 Cookie 的安全性設置。


Startup.cs 中的配置

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.ConfigureApplicationCookie(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; // 滑動過期時間
    });
}

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

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

    app.UseRouting();

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

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}



保存 Cookie
在 Razor Pages 中,你可以在 Page Model 中使用 HttpContext.Response.Cookies.Append 方法來保存 Cookie。

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

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

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

        return Page();
    }
}



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

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;

public class RemoveCookieModel : PageModel
{
    public IActionResult OnGet()
    {
        Response.Cookies.Delete("YourCookieName");
        return Page();
    }
}



讀取 Cookie
你可以使用 HttpContext.Request.Cookies 來讀取 Cookie 的值。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;

public class ReadCookieModel : PageModel
{
    public string CookieValue { get; private set; }

    public IActionResult OnGet()
    {
        if (Request.Cookies.TryGetValue("YourCookieName", out string cookieValue))
        {
            CookieValue = cookieValue;
        }
        else
        {
            CookieValue = "Cookie not found.";
        }

        return Page();
    }
}


完整範例
以下是一個完整的 Razor Pages 範例,包含設置、讀取和刪除 Cookie 的操作。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();

    services.ConfigureApplicationCookie(options =>
    {
        options.Cookie.HttpOnly = true;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.SameSite = SameSiteMode.Strict;
        options.Cookie.Name = "YourCookieName";
        options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
        options.SlidingExpiration = true;
    });
}

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

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

    app.UseRouting();

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

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}


SetCookie.cshtml.cs

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

public class SetCookieModel : PageModel
{
    public IActionResult OnGet()
    {
        var cookieOptions = new CookieOptions
        {
            HttpOnly = true,
            Secure = true,
            SameSite = SameSiteMode.Strict,
            Expires = DateTimeOffset.UtcNow.AddMinutes(60)
        };

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

        return Page();
    }
}



RemoveCookie.cshtml.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

public class RemoveCookieModel : PageModel
{
    public IActionResult OnGet()
    {
        Response.Cookies.Delete("YourCookieName");
        return Page();
    }
}


ReadCookie.cshtml.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

public class ReadCookieModel : PageModel
{
    public string CookieValue { get; private set; }

    public IActionResult OnGet()
    {
        if (Request.Cookies.TryGetValue("YourCookieName", out string cookieValue))
        {
            CookieValue = cookieValue;
        }
        else
        {
            CookieValue = "Cookie not found.";
        }

        return Page();
    }
}


結論
這些步驟展示了如何在 ASP.NET Core Razor Pages 中設置 Cookie 的安全性、保存 Cookie 和移除 Cookie。通過正確的配置和操作,可以確保 Cookie 的安全使用。

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,可以顯著提高應用程序的安全性。

[HTML5]sessionStorage 和 localStorage

sessionStorage 用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問並且當會話結束後數據也隨之銷毀。因此 sessionStorage 不是一種持久化的本地存儲,僅僅是會話級別的存儲。

而 localStorage 用於持久化的本地存儲,除非主動刪除數據,否則數據是永遠不會過期的。




web storage 和 cookie 的區別

Web Storage 的概念和 cookie 相似,區別是它是為了更大容量存儲設計的。 Cookie 的大小是受限的,並且每次你請求一個新的頁面的時候 Cookie 都會被發送過去,這樣無形中浪費了帶寬,另外 cookie 還需要指定作用域,不可以跨域調用

除此之外,Web Storage 擁有 setItem , getItem , removeItem , clear 等方法,不像 cookie 需要前端開發者自己封裝 setCookie,getCookie。

但是 Cookie 也是不可以或缺的:Cookie 的作用是與服務器進行交互,作為 HTTP 規範的一部分而存在 ,而 Web Storage 僅僅是為了在本地 “存儲” 數據而生。




html5 web storage 的瀏覽器支持情況

瀏覽器的支持除了IE7及以下不支持外,其他標準瀏覽器都完全支持 (ie 及 FF 需在 web 服務器裡運行),值得一提的是 IE 總是辦好事,例如 IE7、IE6 中的 UserData 其實就是 javascript 本地存儲的解決方案。通過簡單的代碼封裝可以統一到所有的瀏覽器都支持 web storage。

要判斷瀏覽器是否支持localStorage可以使用下面的代碼:

if(window.localStorage){
    alert("浏览支持localStorage")
}else{
   alert("浏览暂不支持localStorage")
}
//或者
if(typeof window.localStorage == 'undefined'){
    alert("浏览暂不支持localStorage")
}


localStorage 和 sessionStorage 操作

localStorage 和 sessionStorage 都具有相同的操作方法,例如 setItem 、 getItem 和 removeItem 等。




localStorage 和 sessionStorage 的方法


setItem 存儲 value
用途:將value存儲到key字段
用法:.setItem( key, value)

代碼示例:
    sessionStorage.setItem("key", "value");
    localStorage.setItem("site", "js8.in");


getItem 獲取 value
用途:獲取指定key本地存儲的值
用法:.getItem(key)

代碼示例:
    var value = sessionStorage.getItem("key");
    var site = localStorage.getItem("site");


removeItem刪除key
用途:刪除指定key本地存儲的值
用法:.removeItem(key)

代碼示例:
    sessionStorage.removeItem("key");
    localStorage.removeItem("site");


clear清除所有的key/value
用途:清除所有的key/value
用法:.clear()

代碼示例:
    sessionStorage.clear();
    localStorage.clear();



其他操作方法:點操作和[]
web Storage 不但可以用自身的 setItem, getItem 等方便存取,也可以像普通對像一樣用點(.)操作符,及 [] 的方式進行數據存儲,像如下的代碼:

    var storage = window.localStorage;
    storage.key1 = "hello";
    storage["key2"] = "world";
    console.log(storage.key1);
    console.log(storage["key2"]);



localStorage 和 sessionStorage 的 key 和 length屬性實現遍歷
sessionStorage 和 localStorage 提供的 key() 和 length 可以方便的實現存儲的數據遍歷,例如下面的代碼:

    var storage = window.localStorage;
    for (var i=0, len = storage.length; i < len; i++){
        var key = storage.key(i);
        var value = storage.getItem(key);
        console.log(key + "=" + value);
    }



storage 事件
storage還 提供了 storage 事件,當鍵值改變或者 clear 的時候,就可以觸發 storage 事件,如下面的代碼就添加了一個 storage 事件改變的監聽:

    if(window.addEventListener){
        window.addEventListener("storage",handle_storage,false);
    }else if(window.attachEvent){
        window.attachEvent("onstorage",handle_storage);
    }
    function handle_storage(e){
        if(!e){e=window.event;}
    }






資料來源: https://js8.in/2011/10/18/html5%E7%9A%84sessionstorage%E5%92%8Clocalstorage/