方法一:使用 Session 和 JavaScript
1. 設定 Session 過期時間
在 Startup.cs 中設定 Session 過期時間。這樣可以確保當瀏覽器關閉時,Session 將會過期。
csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(20); // 設定 Session 過期時間
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
services.AddControllersWithViews();
}
2. 在 Razor View 中加入 JavaScript
在你的 _Layout.cshtml 或其他共享的 Razor View 中加入以下 JavaScript,這段程式碼會在瀏覽器關閉時發送請求給後端登出使用者。
html
<script>
window.addEventListener("beforeunload", function (event) {
navigator.sendBeacon('/Account/Logout');
});
</script>
3. 建立登出動作
在 AccountController 中建立登出動作,處理登出請求。
csharp
public class AccountController : Controller
{
[HttpPost]
public IActionResult Logout()
{
// 清除使用者的認證資料
HttpContext.Session.Clear();
// 或者使用SignOut
// await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return NoContent();
}
}
方法二:使用 Cookie 和 JavaScript
1. 設定 Cookie 過期時間
在 Startup.cs 中設定 Cookie 認證過期時間。
csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.ExpireTimeSpan = TimeSpan.FromMinutes(20); // 設定 Cookie 過期時間
options.SlidingExpiration = true;
});
services.AddControllersWithViews();
}
2. 在 Razor View 中加入 JavaScript
同樣在 _Layout.cshtml 中加入以下 JavaScript 程式碼,這段程式碼會在瀏覽器關閉時發送請求給後端登出使用者。
html
<script>
window.addEventListener("beforeunload", function (event) {
navigator.sendBeacon('/Account/Logout');
});
</script>
3. 建立登出動作
在 AccountController 中建立登出動作。
csharp
public class AccountController : Controller
{
[HttpPost]
public IActionResult Logout()
{
// 清除使用者的認證資料
HttpContext.Response.Cookies.Delete(".AspNetCore.Cookies");
// 或者使用SignOut
// await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return NoContent();
}
}
小結 通過以上方法,我們可以在瀏覽器關閉時自動登出使用者。這些方法主要依賴於 JavaScript 的 beforeunload 事件以及後端的登出處理邏輯。在實際應用中,可能還需要根據具體情況進行調整,例如設定適當的 Session 或 Cookie 過期時間,確保安全性和用戶體驗。