ASP.NET Core 中使用 Cookie 身份验证
在 ASP.NET Core 中使用 Cookie 身份验证,通常是为了实现用户的登录和授权。以下是配置 Cookie 身份验证的步骤。
1. 安装必要的 NuGet 包
首先,确保项目中包含 Microsoft.AspNetCore.Authentication.Cookies
包。你可以通过 NuGet 包管理器或命令行安装它:
dotnet add package Microsoft.AspNetCore.Authentication.Cookies
2. 配置 Cookie 身份验证
在 ASP.NET Core 6 或更高版本中,配置通常发生在 Program.cs
中。以下是一个典型的配置过程:
在 Program.cs
中配置 Cookie 身份验证
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
// 添加身份验证服务
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
// 设置登录页面路由
options.LoginPath = "/Account/Login"; // 登录路径
options.LogoutPath = "/Account/Logout"; // 登出路径
options.AccessDeniedPath = "/Account/AccessDenied"; // 访问被拒绝路径
// 设置 Cookie 的过期时间
options.SlidingExpiration = true; // 启用滑动过期
options.ExpireTimeSpan = TimeSpan.FromMinutes(30); // 设置过期时间
// 可选的其他设置
// options.Cookie.Name = "YourAppAuthCookie"; // 自定义 Cookie 名称
// options.Cookie.HttpOnly = true; // 禁止 JavaScript 访问 Cookie
// options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 强制 HTTPS 使用 Cookie
});
builder.Services.AddAuthorization(); // 添加授权服务
builder.Services.AddControllersWithViews(); // 添加 MVC 或 Razor Pages 支持
var app = builder.Build();
// 使用身份验证中间件
app.UseAuthentication(); // 必须在 UseAuthorization 之前
// 使用授权中间件
app.UseAuthorization();
app.MapDefaultControllerRoute(); // 设置默认路由
app.Run();
3. 实现登录逻辑
你需要创建一个控制器来处理登录逻辑,并设置用户的身份验证 cookie。
登录控制器
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 IActionResult Login()
{
return View();
}
// 处理登录请求
[HttpPost]
public async Task<IActionResult> Login(string username, string password)
{
// 这里进行用户名和密码的验证,假设验证成功
if (username == "admin" && password == "password") // 示例验证逻辑
{
// 创建用户的身份信息
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Role, "Admin") // 添加角色信息
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
IsPersistent = true, // 设置为 true 则用户在浏览器关闭后仍然保持登录状态
};
// 执行身份验证并设置 Cookie
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity), authProperties);
return RedirectToAction("Index", "Home"); // 登录成功后重定向到主页
}
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View();
}
// 登出逻辑
[HttpPost]
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); // 清除身份验证信息
return RedirectToAction("Login", "Account"); // 重定向到登录页面
}
}
4. 创建登录页面视图
你还需要为登录页面创建一个简单的视图。例如,在 Views/Account/Login.cshtml
中:
@{
ViewData["Title"] = "Login";
}
<h2>Login</h2>
<form method="post">
<div>
<label for="username">Username</label>
<input type="text" id="username" name="username" required />
</div>
<div>
<label for="password">Password</label>
<input type="password" id="password" name="password" required />
</div>
<div>
<button type="submit">Login</button>
</div>
</form>
5. 授权和授权策略
为了限制某些页面只能被已登录用户访问,你可以在控制器或页面上使用 [Authorize]
特性。
示例:使用 [Authorize]
特性
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Authorize] // 确保只有已登录的用户能访问
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
6. 登录后的页面保护
你可以通过 Authorize
特性来保护需要用户登录才能访问的页面或操作。未登录用户将被重定向到登录页面。
总结
- 在
Program.cs
中配置 Cookie 身份验证。 - 使用
SignInAsync
来设置用户的身份验证 Cookie。 - 使用
SignOutAsync
处理用户登出。 - 通过
[Authorize]
特性来保护需要授权的页面。
作者:阿笨
【官方QQ一群:跟着阿笨一起玩NET(已满)】:422315558
【官方QQ二群:跟着阿笨一起玩C#(已满)】:574187616
【官方QQ三群:跟着阿笨一起玩ASP.NET(已满)】:967920586
【官方QQ四群:Asp.Net Core跨平台技术开发(可加入)】:829227829
【官方QQ五群:.NET Core跨平台开发技术(可加入)】:647639415
【网易云课堂】:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628
【51CTO学院】:https://edu.51cto.com/sd/66c64
【微信公众号】:微信搜索:跟着阿笨一起玩NET
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?
2021-02-04 SQL Server数据库高级进阶之事务实战演练
2021-02-04 C#如何正确运用异步编程技术
2021-02-04 SQL Server数据库高级进阶之锁实战演练
2020-02-04 .NET Core基于SQL Server数据库主从同步实现读写分离实战演练
2013-02-04 将要被社会淘汰的8种人