基操
下面的代码添加进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;}
}
创建个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]
方法二:在Program里添加,这样所有的api都需要验证
services.AddMvc(options =>
{
options.Filters.Add(new AuthorizeFilter());
});
在登录控制器里面加上[AllowAnonymous],这个控制器下的api不需要登陆验证
身份权限
设定用户权限的名称
在需要权限验证的api上添加[Authorize(Roles="权限名称")],控制器里面的api都是同一个身份的可以放到类名上面
创建个身份权限的模型
改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; }
}
添加几个管理员权限
然后默认创建账号时普通用户
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 "创建账号成功";
}
修改登陆后的身份
登录有效时间
局部设置出现在有多个登录的情况下使用
全局设置:
局部设置:
取出登录用户信息
Program.cs添加
builder.Services.AddHttpContextAccessor();
在控制器
var Claim = _httpContextAccessor.HttpContext.User.Claims.ToList();
var userName = Claim.Where(x => x.Type == "昵称").First().Value;
\