CustomRequireClaimHandler 继承自AuthorizationHandler
在写三上是在一的根本上写的,所以有没有看过二是没得关系的,在一中介绍了认证与授权,但是没有去介绍拿到证书后怎样去验证授权。
观点性对象:在这套机制中,把这个权限认证呢,称作为policy。这个policy是怎么样的过程呢?
就像我前面说的,证书也认证了,policy做的是查抄你的证书中是否切合我心中的标准。
好比说,我有一个接口实行的是驾驶证查抄。功效你只有一张学生证,你不能那一张学生证当驾驶证去开车吧,必定就不让你访谒啊。
也许还有点迷糊,请看正文。正文皆为小我私家理解,如有错误,请斧正。
请看下面的:
services.AddAuthorization(config=> { var defaultAuthBuilder = new AuthorizationPolicyBuilder(); var defaultPolicy = defaultAuthBuilder.RequireAuthenticatedUser().Build(); config.DefaultPolicy = defaultPolicy; });这时候就是在配置授权了。
defaultAuthBuilder.RequireAuthenticatedUser().Build() 中,RequireAuthenticatedUser去要求用户必需颠末认证的,也就是不允许匿名用户,这个很好理解。
设置默认的计谋认证就是这个了。
这时候我访谒:
https://localhost:44350/Home/Secret
是正常的,因为我原来就是认证过的。
然后我改了一下:
和上面差此外,我加了RequireClaim(ClaimTypes.Country),,我要求起码有一个证书你要有国家。
我再次贴下证书的代码,在.net core 认证与授权(一)中也有。
var SchoolClaims = new List<Claim>() { new Claim(ClaimTypes.Name,"Jack"), new Claim(ClaimTypes.Email,"[email protected]") }; var LicensClaims = new List<Claim>() { new Claim(ClaimTypes.Name,"Jack.li"), new Claim(ClaimTypes.Email,"[email protected]"), new Claim("begin","2000.10.1") }; var SchoolIdentity = new ClaimsIdentity(SchoolClaims,"Student Identity"); var CarManagerIdentity = new ClaimsIdentity(LicensClaims, "Licens Identity"); var userPrincipal = new ClaimsPrincipal(new[] { SchoolIdentity, CarManagerIdentity }); HttpContext.SignInAsync("CookieAuth", userPrincipal); return RedirectToAction("Index");在两个证书中,都没得国家。
然后访谒:
https://localhost:44350/Home/Secret
自动跳转到了一个授权没有通过的网站,刚巧我没有写这个网页,临时着就是没有通过的意思。
然后我再一个证书中添加了一个: new Claim(ClaimTypes.Country,"china")
这样我又告成了。
好的,这是默认的计谋,那么如何自界说呢?
上面我添加了一个计谋,名字叫做Claim.Country.
因为不是默认,所以要[Authorize(Policy = "Claim.Country")]
policyBuilder 相当于上面的var defaultAuthBuilder = new AuthorizationPolicyBuilder();。
然后里面去设置起码有一个证书中要有国家。
policyBuilder 默认有一些限制可以使用,那么如何本身来界说呢?究竟是一种什么模式呢?
CustomRequireClaim 是什么呢?担任IAuthorizationRequirement。其实是模拟生活中的什么呢,好比说你要向批发商进一匹对象,有一些需求,好比说苹果要通红的,你就可以在这里填写。
CustomRequireClaimHandler 担任自AuthorizationHandler,批发商带一批货(措施也就是用户带着证书来了),你可以这个查抄合格不同格,拿着你的需求表比较。
那么注册进入:
同样需要:
services.AddScoped<IAuthorizationHandler, CustomRequireClaimHandler>();这里就有疑问了,你这个policyBuilder.AddRequirements(new CustomRequireClaim(ClaimTypes.Country));就能挪用到CustomRequireClaimHandler。
这个疑问简单化就是,你有一个需求,就只挪用到查抄类?
其实是在软件设计中,有这样一种套路,就是按照实体类,能自动挪用执行类,这是一种设计模式。其实也能理解,就是呢,好比说公司有一张告假单,都标明是告假单了,必定交给部门经理啊,AuthorizationHandler
<CustomRequireClaim>就是符号,措置惩罚惩罚CustomRequireClaim的。
在里面其实只有IAuthorizationHandler,但是按照CustomRequireClaim能实例出CustomRequireClaimHandler。所以也需要加上:
同样,回过头来,看下面的。
policyBuilder.RequireClaim(ClaimTypes.Country);如何做到直接点出来,不用这种add的方法呢?也就是说我也想实现这样的。
policyBuilder.RequireCustomClaim(ClaimTypes.Country);温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30405.html