Asp.Net Core MVC 读取Cookie

本文介绍了如何在ASP.NET Core应用中配置Cookie认证,包括在Startup.cs文件中注册和启用Cookie认证服务,以及在登录控制器中设置和读取用户Cookie信息。登录成功后,将用户ID、用户名和角色ID存储到Cookie中,并利用ClaimsPrincipal进行用户身份验证。在后续请求中,通过检查 HttpContext.User.Identity.IsAuthenticated 和 Claims 获取用户登录状态及信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.打开Startup.cs

ConfigureServices方法中添加

//注册Cookie认证服务
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();

Configure方法中添加

//启用Cookie认证中间件
            app.UseAuthentication();

据说代码放的位置也有说法,对于新手的我来说,好用就没深入纠结了

在这里插入图片描述

2.找到对应登录的控制器方法或接口

userList ,从数据库查询,判断 >0 证明登录成功,将三个值存到Coolie

var userList = new ZeroSoft.BLL.UserManage().GetModelList($"username='{username}' and password='{password.ToMd5()}'");

//登录成功后存cookie
if (userList.Count > 0)
 {
	var claims = new List<Claim>() {
     new  Claim("userId",Convert.ToString(userList[0].id)),  //用户id
      new  Claim("userName",Convert.ToString(userList[0].userName)),//用户名
      new  Claim("roleId",Convert.ToString(userList[0].roleId))//角色id
 };

var claimsIdentity = new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme);
ClaimsPrincipal user = new ClaimsPrincipal(claimsIdentity);
Task.Run(async () =>
                {
                    //登录用户,相当于ASP.NET中的FormsAuthentication.SetAuthCookie
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user);

                    //可以使用HttpContext.SignInAsync方法的重载来定义持久化cookie存储用户认证信息,例如下面的代码就定义了用户登录后60分钟内cookie都会保留在客户端计算机硬盘上,
                    //即便用户关闭了浏览器,60分钟内再次访问站点仍然是处于登录状态,除非调用Logout方法注销登录。
                    //注意其中的AllowRefresh属性,如果AllowRefresh为true,表示如果用户登录后在超过50%的ExpiresUtc时间间隔内又访问了站点,就延长用户的登录时间(其实就是延长cookie在客户端计算机硬盘上的保留时间),
                    //例如本例中我们下面设置了ExpiresUtc属性为60分钟后,那么当用户登录后在大于30分钟且小于60分钟内访问了站点,那么就将用户登录状态再延长到当前时间后的60分钟。但是用户在登录后的30分钟内访问站点是不会延长登录时间的,
                    //因为ASP.NET Core有个硬性要求,是用户在超过50%的ExpiresUtc时间间隔内又访问了站点,才延长用户的登录时间。
                    //如果AllowRefresh为false,表示用户登录后60分钟内不管有没有访问站点,只要60分钟到了,立马就处于非登录状态(不延长cookie在客户端计算机硬盘上的保留时间,60分钟到了客户端计算机就自动删除cookie)

                    await HttpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    user, new AuthenticationProperties()
                    {
                        IsPersistent = true,
                        ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(60),
                        AllowRefresh = true
                    });


                }).Wait();
2.读取Cookie
//如果HttpContext.User.Identity.IsAuthenticated为true,
//或者HttpContext.User.Claims.Count()大于0表示用户已经登录
if (HttpContext.User.Identity.IsAuthenticated)
{
  //这里通过 HttpContext.User.Claims 可以将我们在Login这个Action中存储到cookie中的所有
  //claims键值对都读出来,比如我们刚才定义的UserName的值Wangdacui就在这里读取出来了
  var userId = HttpContext.User.Claims.First().Value;
  var userName = HttpContext.User.Claims.Where(User => User.Type == "userName").First().Value;
  var roleId = HttpContext.User.Claims.Where(User => User.Type == "roleId ").First().Value;
  var roleId = HttpContext.User.Claims.Last().Value;
            }
First() 和 Last(),只能取第一个和最后一个值,至于中间的,只能用Linq语法去获取值
哪位老哥还有别的方式取值,跟我回复下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DotNeter-Hpf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值