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;
}