ASP.NET Core 中基于 Cookie 的身份鉴权实现

B站影视 2025-01-20 08:34 2

摘要:在 Asp.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。

在 Asp.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。

首先,在Startup.csProgram.cs文件中配置 Cookie 身份验证。这包括设置登录路径、登出路径、Cookie 的过期时间等参数。在Program.cs文件中,配置 Cookie 身份验证:var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.LogoutPath = "/Account/Logout";
options.AccessDeniedPath = "/Account/AccessDenied";
options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
options.SlidingExpiration = true;
}); // 安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
builder.Services.AddControllersWithViews.AddRazorRuntimeCompilation;

var app = builder.Build;

if (!app.Environment.IsDevelopment)
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts;
}

app.UseHttpsRedirection;
app.UseStaticFiles;

app.UseRouting;

app.UseAuthentication;
app.UseAuthorization;

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

app.Run;

接下来,你需要创建处理登录和登出请求的控制器和视图。

创建 AccountController创建一个,用于处理登录和登出逻辑:using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
using System.Threading.Tasks;

publicclassAccountController:Controller
{
[HttpGet]
public IActionResultLogin(stringreturnUrl = "/")
{
Viewdata["ReturnUrl"] = returnUrl;
return View;
}

[HttpPost]
[ValidateAntiForgeryToken]
public async TaskLogin(LoginViewModel model,stringreturnUrl = "/")
{
if (ModelState.IsValid)
{
// 验证用户名和密码
if (model.Username == "admin" && model.Password == "123456")
{
var claims = new List
{
new Claim(ClaimTypes.Name, model.Username),
new Claim(ClaimTypes.Role, "Admin")// 可以根据需要添加角色
};

var claimsIdentity = new ClaimsIdentity(
claims, CookieAuthenticationDefaults.AuthenticationScheme);

var authProperties = new AuthenticationProperties
{
IsPersistent = model.RememberMe,
RedirectUri = returnUrl
};

await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);

return LocalRedirect(returnUrl);
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
}
}

return View(model);
}

[HttpPost]

Logout
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Index", "Home");
}
}创建 Login 视图创建一个Login.cshtml视图,用于显示登录表单:创建 LoginViewModel创建一个,用于绑定登录表单的数据:public classLoginViewModel
{
[Required]
[Display(Name = "User name")]
publicstringUsername { get; set; }

[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
publicstringPassword { get; set; }

[Display(Name = "Remember me?")]
publicboolRememberMe { get; set; }
}一旦配置了 Cookie 身份验证,你可以使用[Authorize]特性来保护你的 API 路由,确保只有经过身份验证的用户可以访问受保护的资源。[Authorize]
public classProtectedController:Controller
{
public IActionResultGetProtectedData
{
return Ok(new { message = "This is protected data" });
}
}

客户端在请求受保护的 API 时,浏览器会自动发送存储在 Cookie 中的身份验证数据。服务器会通过 Cookie 中间件验证这些数据的有效性,并允许或拒绝请求。

用户可以通过访问登出路径来登出。登出逻辑会清除用户的 Cookie,从而结束会话。

[HttpPost]
[ValidateAntiForgeryToken]
public async TaskLogout
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Index", "Home");
}

通过以上步骤,可以在 ASP.NET Core 应用中实现基于 Cookie 的身份鉴权,确保你的应用能够安全地验证用户身份并授权访问特定资源。Cookie 的持久性和易于管理的特性使其成为传统 Web 应用中身份验证的理想选择。

来源:opendotnet

相关推荐