身份验证(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";
}
}
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。