NetCore之身份验证Authentication
身份验证(Authentication)是确定用户身份的过程。
授权(Authentication)是确定用户是否有权访问资源的过程
授权是指确定用户可执行的操作的过程。 例如,允许管理用户创建文档库、添加文档、编辑文档和删除文档。 使用库的非管理用户仅获得读取文档的权限。
授权与身份验证相互独立。
但是,授权需要一种身份验证机制。 身份验证是认定用户的过程。 身份验证可为当前用户创建一个或多个标识。
1:基本授权
首先先在Configure中添加鉴权的中间件
//使用鉴权(身份验证)是指验证用户是否拥有访问系统的权利 app.UseAuthentication();
在ConfigureServices中注入服务
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddRazorPages(); //Cookies services.AddAuthentication(defaultScheme: "Cookies") .AddCookie(option => { option.LoginPath = new Microsoft.AspNetCore.Http.PathString(value: "/Authorization/Index"); }); }
/Authorization/Index
public class AuthorizationController : Controller { public AuthorizationController() { } // GET: Authorization public ActionResult Index(string Role) { //Claim是什么,可以理解为你的身份证的中的名字,性别等等的每一条信息, //然后Claim组成一个ClaimIdentity 就是组成一个身份证 var claim = new List<Claim> { new Claim(ClaimTypes.Name,value:"张三"), new Claim(type:"Address",value:"北京市"), new Claim(ClaimTypes.Role,Role) }; var identity = new ClaimsIdentity(claim,authenticationType:"ZSIdentity"); HttpContext.SignInAsync(principal:new ClaimsPrincipal(identity)); return View(); } }
如果不在HomeController上面不加Authorize,我们是可以正常浏览Home/Index
如果在HomeController上面加Authorize,我们是不可以正常浏览Home/Index,
会报错,然后页面跳转到/Authorization/Index
先去/Authorization/Index 做授权
我们先/Authorization/Index授权成功,再去浏览Home/Index就是ok的
同时我们F12,去看浏览器的Application就会有Cookies值
[Authorize] public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { return View(); } }
2:角色授权
/Authorization/Index 中的内容不变,变的是HomeController中的方法
[Authorize] public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { return View(); } //SVIP这个页面,Roles为SVIP的可以访问 [Authorize(Roles = "SVIP")] public string SVIP() { return "SVIP"; } //VIP这个页面,Roles为SVIP,VIP的可以访问 [Authorize(Roles = "SVIP,VIP")] public string VIP() { return "VIP"; } //NoVIP这个页面,Roles为SVIP,VIP,NoVIP 的可以访问 [Authorize(Roles = "SVIP,VIP,NoVIP")] public string NoVIP() { return "NoVIP"; } } //Roles的值是从new Claim(ClaimTypes.Role,Role) 这里传入进来的
3:策略认证(角色认证的Plus版本)
先去ConfigureServices中注入
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddRazorPages(); //Cookies services.AddAuthentication(defaultScheme: "Cookies") .AddCookie(option => { option.LoginPath = new Microsoft.AspNetCore.Http.PathString(value: "/Authorization/Index"); }); #region 策略 services.AddAuthorization(configure => { //SVIP是策略的名字 configure.AddPolicy(name: "SVIP", option => { //SVIP是角色 option.RequireRole(roles: "SVIP");//用户的角色必须是SVIP,才能访问SVIP Page //option.RequireRole(roles: "admin");这个意思是传过来的策略的值必须是SVIP和Admin } ); configure.AddPolicy(name: "VIP", option => { //就是角色"SVIP", "VIP" 都可以访问策略为VIP Page option.RequireRole("VIP","SVIP"); }); configure.AddPolicy(name: "NoVIP", option => { //就是角色"NoVIP", "VIP" 都可以访问策略为NoVIP Page option.RequireRole("NoVIP", "VIP", "SVIP"); }); }); #endregion }
然后更改下授权页的方式
[Authorize] public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { return View(); } [Authorize(Policy = "SVIP")] public string SVIP() { return "SVIP"; } [Authorize(Policy = "VIP")] public string VIP() { return "VIP"; } [Authorize(Policy = "NoVIP")] public string NoVIP() { return "NoVIP"; } }
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。