程序认证身份之后就是授权,授权也有很多种
三种:基于角色, 基于声明,基于策略
此次授权的demo之git地址:https://github.com/xeekseven/AspNet-core-Example/tree/master/ANC-Authorize-Policy
基于声明:(用此可以替代基于角色了)
其实这个有点像自由版 基于角色 授权。其中的判断逻辑运算还是 equal,但是type和值都可以自己定义
- 首先启用服务
services.AddAuthorization(options =>
{
//声明一个名为Administrator的授权,判断角色的claimType为Role的值是否equal Administrator
options.AddPolicy("Administrator", policy => policy.RequireClaim("Role","Administrator"));
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.AccessDeniedPath = new PathString("/Home/NotPermission");
options.LoginPath = new PathString("/Home/Login");
options.ExpireTimeSpan = TimeSpan.FromSeconds(10);
});
可以看到 添加了一个Type为Role的声明,然后又认证失败时候重定向路径
options.LoginPath = new PathString("/Admin/Login");
然后也添加了一个无权限时的重定向路径
options.AccessDeniedPath = new PathString("/Home/NotPermission");
- 然后配置HTTP请求管道:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
以上就是配置了
- 首先是登录,
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Login(string username,string password)
{
var returnUrl = HttpContext.Request.Query["ReturnUrl"];
string roleType = "";
if(username == "admin"){
roleType = "Administrator";
}
else if(username == "custom"){
roleType = "Custom";
}
if((username == "admin" && password == "admin") || (username == "custom" && password == "custom")){
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name,username),
new Claim("Role",roleType)
};
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties());
if (!string.IsNullOrWhiteSpace(returnUrl))
{
return Redirect(returnUrl);
}
return Redirect("/Home/Index");
}
if (!string.IsNullOrWhiteSpace(returnUrl))
{
return Redirect(returnUrl);
}
return Redirect("/Home/Login");
}
- 接下来就是使用声明来进行鉴权了。在需要鉴权的接口加上特性并指定特定的声明即可,没有权限的(Role的对应的值 !=Administrator)就会重定向到 "/Home/NotPermission"(options.AccessDeniedPath = new PathString("/Home/NotPermission");)
[Authorize(Policy="Administrator")]
public IActionResult Privacy()
{
return View();
}
- 总结就是:
- 配置服务(Policy定义)、
- 配置管道使用,
- 登录时赋值(Type = Role,value=RoleValue),
- 接口加上指定Policy的Authorize特性
前一篇 — ASP.NET Core中的授权(1) — 基于角色:https://www.jianshu.com/p/a8e663627ec9
下一篇 — ASP.NET Core中的授权(3) — 基于自定义策略:https://www.jianshu.com/p/0bdf572cc103
网友评论