.Net6 WebApi Cookie身份验证

615 阅读2分钟

基操

下面的代码添加进Program

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(option =>
    {
    //没有登陆时跳转到
    option.LoginPath = new PathString("/api/Login/NoLogin");
        //没有权限时
    opt.AccessDeniedPath = new PathString("/api/Login/NoRole");
    });        
​
​
   //顺序不能动
   app.UseCookiePolicy();
   app.UseAuthentication();
   app.UseAuthorization();

然后创建一个用户类User

public class User
    {
        public Guid Id { get; set; }
        public string? Name { get; set; }
        public string Account { get; set; }
        public string PassWord { get; set; }
        public string? Power {get;set;}
    }

456456.png

创建个Login控制器然后放入创建,登录,退出,未登录的demo

public class LoginController : ControllerBase
    {
        private readonly StudentContext _context;
        public LoginController(StudentContext context)
        {
            _context = context;
        }
        [HttpPost]
        public string  Login(User user)
        {
            if(_context.User.Any(x=>x.Account == user.Account))
            {
                var result = _context.User.Where(x => x.Account == user.Account && x.PassWord == user.PassWord).FirstOrDefault();
                if (result == null)
                {
                    return "账号或者密码错误";
                }
                else
                {
                    var claims = new List<Claim>
                    {
                        new Claim(ClaimTypes.Name, result.Account),
                        new Claim("昵称", result.Name),
                        new Claim(ClaimTypes.Role,result.Power)
                    };
                    var claimsIdentity = new ClaimsIdentity(claims,CookieAuthenticationDefaults.AuthenticationScheme);
                    HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
                    return "登录成功";
                }
            }
            else
            {
                return "账号不存在";
            }
        }
       [HttpPost]
       public string  CreateLogin(User user)
        {
            if (_context.User.Any(x => x.Account == user.Account))
            {
                return "账号已存在";
            }
            user.Id = Guid.NewGuid();
            _context.User.Add(user);
            _context.SaveChanges();
            return "创建账号成功";
        }
        [HttpDelete]
        public string Logout()
        {
            HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
            return "成功退出登录";
        }
        [HttpGet]
        public string NoLogin()
        {
            return "未登录";
        }
        [HttpGet]
        public string NoRole()
        {
            return "用户没有权限";
        }
    }

使用方法一:可以在需要验证的api接口或者类名上添加[Authorize]

QQ截图20220302234302.png

方法二:在Program里添加,这样所有的api都需要验证

services.AddMvc(options =>
{
    options.Filters.Add(new AuthorizeFilter());
});

在登录控制器里面加上[AllowAnonymous],这个控制器下的api不需要登陆验证 QQ截图20220302235522.png

身份权限

设定用户权限的名称

QQ截图20220303001152.png 在需要权限验证的api上添加[Authorize(Roles="权限名称")],控制器里面的api都是同一个身份的可以放到类名上面

QQ截图20220303001646.png

创建个身份权限的模型

QQ截图20220303105730.png

改User类

public class User
    {
        public Guid Id { get; set; }
        public string? Name { get; set; }
        public string Account { get; set; }
        public string PassWord { get; set; }
        public Role? Role { get; set; }
    }

添加几个管理员权限

QQ截图20220303110159.png

然后默认创建账号时普通用户

 public string  CreateLogin(User user)
        {
            if (_context.User.Any(x => x.Account == user.Account))
            {
                return "账号已存在";
            }
            user.Id = Guid.NewGuid();
            user.Role = _context.Role.Where(x => x.Name == "用户").FirstOrDefault();
            _context.User.Add(user);
            _context.SaveChanges();
            return "创建账号成功";
        }

修改登陆后的身份

QQ截图20220303110921.png

登录有效时间

局部设置出现在有多个登录的情况下使用

全局设置:

QQ截图20220303111834.png 局部设置:

QQ截图20220303112321.png

取出登录用户信息

Program.cs添加

builder.Services.AddHttpContextAccessor();

在控制器

QQ截图20220304142006.png

var Claim =   _httpContextAccessor.HttpContext.User.Claims.ToList();
var userName = Claim.Where(x => x.Type == "昵称").First().Value;

\