一般而言MVC 是不与其他系统发生数据交互,所以使用Cookie验证即可,无需安装拓展。
1.Program里面注册服务
//1.选择使用那种方式来身份验证
builder.Services.AddAuthentication(option =>
{
option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; //默认身份验证方案
option.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
option.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
option.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme;
option.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option =>
{
option.LoginPath = "/Login/Login";//如果没有找到用户信息---身份验证失败--授权也失败了---就跳转到指定的Action
option.LogoutPath = "/Login/Logout";//登出跳转
option.AccessDeniedPath = "/Login/Login";//身份验证失败页面
//option.Events.OnRedirectToLogin = context =>
//{
// //context.Response.StatusCode = 302; // 设置302重定向状态码
// //context.Response.Headers["Location"] = "/Login/Login"; // 重定向到登录页
// //context.Response.Redirect(context.RedirectUri);
// return Task.CompletedTask;
//};
});
//2)在 app.UseAuthorization() 代码上添加 UseAuthentication 即 身份验证中间件,
app.UseAuthentication();//身份验证中间件,必须在前
app.UseAuthorization();//授权中间件
2.在用户登录时给添加身份(LoginModel 只是我的接收参数的类,此处改为自己的即可)
public async Task<IActionResult> LoginAction([FromBody] LoginModel model)
{
//.....身份验证逻辑
//.....
//验证成功,创建身份信息
var claims = new List<Claim>()//身份验证信息
{
new Claim(ClaimTypes.Name,$"{model.Account}"),//用户传过来的账号
new Claim(ClaimTypes.Role,model.RoleName),用户传过来的角色,最好根据账号从数据库查询,用于授权
new Claim("PassWord",model.PassWord),//用户传过来的密码
new Claim("RoleId",RoleId),//可以写入任意数据
};
//通过Claim来创建ClaimsIdentity 类似于通过用户的身份来创建身份证
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var authProperties = new AuthenticationProperties
{
//应该允许刷新身份验证会话。
AllowRefresh = true,
//身份验证票证过期的时间10分钟
ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30),
//允许持久化
IsPersistent = true,
//cookie过期时间1天
IssuedUtc = DateTime.Now.AddDays(1),
重定向url地址
//RedirectUri = "/Login/Login"
};
//授权cookie
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
var result = new
{
success = true,
msg = "登录成功",//消息
};
return Json(result);
}
用户退出登录
/// <summary>
/// 退出
/// </summary>
/// <returns></returns>
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Login");
}
获取用户信息:
/// <summary>
/// 获取用户信息
/// </summary>
/// <returns></returns>
//[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
public string GetUser()
{
try
{
if (HttpContext.User.Identity != null)
{
if (HttpContext.User.Identity.IsAuthenticated) //判断用户是否通过认证
{
string name = HttpContext.User.Claims.ToList()[0].Value;
return name;
}
else
{
return "未登录";
}
}
return "无权访问";
}
catch (Exception ex)
{
return "欢迎";
}
}
授权使用方法(注:三种授权方式(Policy、Role、Scheme),这里是通过角色授权):
[Authorize(Roles = "SysAdmin,UserAdmin,RoleAdmin")]//只有角色为SysAdmin,UserAdmin,RoleAdmin其中一个的可访问该控制器
public class RoleController : Controller//你的控制器
{
/// <summary>
/// 用户管理
/// </summary>
/// <returns></returns>
[Authorize(Roles = "SysAdmin,UserAdmin")]//Authorize不传参数的话代表只要验证成功就可访问控制器,容易造成垂直越权行为
public IActionResult UserManager()
{
return View();
}
}