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

news/2025/1/23 11:16:51/文章来源:https://www.cnblogs.com/netcore5/p/18687385

在 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;});builder.Services.AddControllersWithViews();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

创建一个 AccountController,用于处理登录和登出逻辑:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;
using System.Threading.Tasks;public class AccountController : Controller
{[HttpGet]public IActionResult Login(string returnUrl = "/"){ViewData["ReturnUrl"] = returnUrl;return View();}[HttpPost][ValidateAntiForgeryToken]public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = "/"){if (ModelState.IsValid){// 验证用户名和密码if (model.Username == "admin" && model.Password == "123456"){var claims = new List<Claim>{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][ValidateAntiForgeryToken]public async Task<IActionResult> Logout(){await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);return RedirectToAction("Index", "Home");}
}

创建 Login 视图

创建一个 Login.cshtml 视图,用于显示登录表单:

@model LoginViewModel<h2>Login</h2><form asp-action="Login" asp-route-returnUrl="@ViewData["ReturnUrl"]" method="post"><div asp-validation-summary="All" class="text-danger"></div><div class="form-group"><label asp-for="Username"></label><input asp-for="Username" class="form-control" /><span asp-validation-for="Username" class="text-danger"></span></div><div class="form-group"><label asp-for="Password"></label><input asp-for="Password" class="form-control" type="password" /><span asp-validation-for="Password" class="text-danger"></span></div><div class="form-group"><div class="checkbox"><label asp-for="RememberMe"><input asp-for="RememberMe" />@Html.DisplayNameFor(m => m.RememberMe)</label></div></div><button type="submit" class="btn btn-primary">Log in</button>
</form>

创建 LoginViewModel

创建一个 LoginViewModel,用于绑定登录表单的数据:

public class LoginViewModel
{[Required][Display(Name = "User name")]public string Username { get; set; }[Required][DataType(DataType.Password)][Display(Name = "Password")]public string Password { get; set; }[Display(Name = "Remember me?")]public bool RememberMe { get; set; }
}

三、保护 API 路由

一旦配置了 Cookie 身份验证,你可以使用 [Authorize] 特性来保护你的 API 路由,确保只有经过身份验证的用户可以访问受保护的资源。

[Authorize]
public class ProtectedController : Controller
{ public IActionResult GetProtectedData(){return Ok(new { message = "This is protected data" });}
}

四、客户端请求

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

五、登出逻辑

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

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout()
{await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);return RedirectToAction("Index", "Home");
}

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873628.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16 个 JavaScript 简写神技,提效 60%!

今天看到一片文章觉得很适合在工作中常常用得到 1. 三元运算符简化条件判断 // 传统写法 let result; if (someCondition) {result = yes; } else {result = no; }// 简写方式 const result = someCondition ? yes : no;2. 空值合并运算符 // 传统写法 const name = user.name…

.NET开源强大的高级日期和时间库

NodaTime 是一个为 .NET 设计的开源高级日期和时间库,提供了比 .NET 框架自带的 DateTime 和 DateTimeOffset 更加丰富和可靠的日期时间操作功能。 1. 安装 NodaTime 首先,通过 NuGet 安装 NodaTime 包: Install-Package NodaTime2. 基本概念 NodaTime 提供了多种日期和时间…

Python运行找不到tcl

运行程序提示如下: 说明D:/python/lib/tcl8.6找不到tcl8.6 解决办法:将D:\python\tcl下的tcl8.6和tk8.6两个文件夹复制到D:/python/lib/下问题得到解决

cad的打印到pdf 页边距处理

修改为微软的打印机, microsoft print to pdf后可以正常打印 但是测试过程中看到微软这个打印无法打印a2图纸 查询后是a2图纸不在默认的微软打印的列表中 按照网上的教程做了增加https://zhidao.baidu.com/question/988163076953180379.html我看图纸比例是按照1.8倍数来的, 按…

DolphinScheduler接口实操(二):如何寻找接口

转载自风_间 上一篇写了《DolphinScheduler接口实操(一):利用接口实现高效批量工作流导入及脚本上线》,通过DolphinScheduler的一些接口来实现导入-上线工作流,那么DolphinScheduler的接口应该怎么找呢?在此简单总结一篇。 接下来以手动执行一次工作流为例。 寻找接口 首…

qemu 搭建 uos ARM 架构

参考 https://blog.csdn.net/qq_41619571/article/details/1244310521.资料包下载 QEMU下载地址:链接:https://pan.baidu.com/s/1onUxTbS3RBXdBWWEwAnUBw 提取码:8888 如果不能下载请到官网下载 https://soft.wsyhn.com/soft/qemu9.0.0.exe 操作…

网站后台数据库修改密码

要修改网站后台数据库的密码,您需要访问数据库管理工具,如phpMyAdmin或MySQL Workbench。在这些工具中,您可以找到用户表,并修改相应的密码字段。具体的步骤和操作可能因数据库类型和管理工具而异。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种C…

初创团队如何实现高效率管理任务和人员?4种方法和工具学起来

在当今竞争激烈、节奏快速的商业环境中,团队高效管理成为企业脱颖而出、持续发展的核心要素。高效管理的团队犹如一部精密运转的机器,各部分协同配合,能够显著提升工作效率,增强团队协作能力,保障项目顺利推进,为企业创造更大的价值。接下来,我们将深入剖析实现团队高效…

网站里的代码被修改了怎么办?

如果您发现网站里的代码被修改了,首先要做的是尽快采取措施恢复原始代码,以防止进一步的损失或安全问题。以下是一些建议:备份原始代码:如果您有网站代码的备份,立即恢复备份。如果没有备份,尝试从版本控制系统(如Git)中恢复代码。 检查修改记录:查看网站的版本控制系…

如何修改网站字体

修改网站字体涉及编辑CSS文件:访问文件:使用FTP软件或代码编辑器访问网站的根目录,找到包含CSS样式的文件。 打开文件:使用代码编辑器打开文件,找到需要修改的字体样式部分。 编辑字体属性:修改其中的字体属性(如font-family、font-size等)。 保存文件:保存文件并上传…

尝试本地部署|DeepSeek

微博上看到DeepSeek的报告,尝试想本地部署 百度,bing 后,深感英文太差,找个翻译帮助; 1、找到网址 how-to-run-locally https://github.com/deepseek-ai/DeepSeek-V3?tab=readme-ov-file#6-how-to-run-locally 2、按步骤Clone git clone https://github.com/deepseek-…