做个简单的Authorization
Authorization,意为授权,当用户登录后,用户已经有了自己的身份信息(我是谁),但是用户也分层级,有普通用户,VIP用户甚至管理员,我们现在要求只能管理员可以登录,怎么做呢?很简单,先了解下怎么配置Authorization。
先在service中配置Authorization:
services.AddAuthorization(config =>
{
//先要有一个授权策略的Builder(这个不知道翻译成什么好,就叫builder吧)
var defaultBuilder = new AuthorizationPolicyBuilder();
//用builder配置权限策略
var defaultPolicy = defaultBuilder
.RequireAuthenticatedUser()
//可以验证用户的角色是否为user
.RequireRole("user")
//可以验证用户的身份信息中是否包含出生日期
.RequireClaim(ClaimTypes.DateOfBirth)
.Build();
//作为默认的策略
config.DefaultPolicy = defaultPolicy;
});
AddAuthorization意为添加授权策略,如果没有后面的action参数,采用的是默认策略,效果体现不出来,所以我们自己配置一下这个策略,然后我们可以在HomeController中写一些方法验证它是否生效:
//Authorize特性修饰的方法表示这个方法只有通过身份验证和授权策略的用户方可访问
[Authorize]
public IActionResult IsAuthenticated()
{
return View();
}
//要求角色为user的用户才能访问,下面那个同理。但因为我们采用的默认策略就是要role为user的所以效果与上面的一致
[Authorize(Roles ="user")]
public IActionResult IsUser()
{
return View();
}
[Authorize(Roles ="admin")]
public IActionResult IsAdmin()
{
return View();
}
我们为这三个方法分别建立视图来测试下,发现这个角色的要求确实生效了。
上面的制定的授权策略是默认策略,假如我有一些方法是要特殊的用户才能访问,其他的方法还是普通用户访问,换句话说,我想专门为一些方法制定一个策略,怎么办呢,那么我们就加入一个自定义策略即可,将之前的AddAuthorization方法改造一下:
services.AddAuthorization(config =>
{
var defaultBuilder = new AuthorizationPolicyBuilder();
var defaultPolicy = defaultBuilder
.RequireAuthenticatedUser()
.Build();
config.DefaultPolicy = defaultPolicy;
var MyPolicy = defaultBuilder
.RequireAuthenticatedUser()
.RequireClaim(ClaimTypes.Gender)
.Build();
config.AddPolicy("MyPolicy", MyPolicy);
});
这样,我们就有了两个策略,一个默认策略,一个自定义策略。可以分别再写两个测试方法测试下:
[Authorize]
public IActionResult DefaultPolicy()
{
return View("Index");
}
//可以看到访问这个方法时是access deny的,因为我们登录的user没有gender这个claim
[Authorize(Policy = "MyPolicy")]
public IActionResult MyPolicy()
{
return View("Index");
}
其实T0shik教程里对这个自定义授权策略做了许多封装,但说实在我没有理解为什么要那样做,等以后回过头来再看吧。那么,这一节课到这儿就结束了,我还是建议大家在敲代码中多思考一些问题,带着这些问题去百度谷歌或者看源码(我不建议看微软文档,那些例子看的人要吐血…),毕竟我也只是一个初学者,只能带你们看到一点identity的皮毛,里面的核心还是要靠自己去探索。然后这节课的源码同样上传到了我的github,demo叫做PolicyAndClaim,不想敲代码的童鞋可以直接下载源码学习(记得点个star哦~)