前言

在写三上是在一的基础上写的,所以有没有看过二是没得关系的,在一中介绍了认证与授权,但是没有去介绍拿到证书后怎样去验证授权。

概念性东西:在这套机制中,把这个权限认证呢,称作为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

是正常的,因为我本来就是认证过的。

然后我改了一下:

services.AddAuthorization(config=> {
var defaultAuthBuilder = new AuthorizationPolicyBuilder();
var defaultPolicy = defaultAuthBuilder.RequireAuthenticatedUser().RequireClaim(ClaimTypes.Country).Build();
config.DefaultPolicy = defaultPolicy;
});

和上面不同的,我加了RequireClaim(ClaimTypes.Country),我要求起码有一个证书你要有国家。

我再次贴下证书的代码,在.net core 认证与授权(一)中也有。

var SchoolClaims = new List<Claim>()
{
new Claim(ClaimTypes.Name,"Jack"),
new Claim(ClaimTypes.Email,"Jack@fmail.com")
}; var LicensClaims = new List<Claim>()
{
new Claim(ClaimTypes.Name,"Jack.li"),
new Claim(ClaimTypes.Email,"Jack@fmail.com"),
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")

这样我又成功了。

好的,这是默认的策略,那么如何自定义呢?

config.AddPolicy("Claim.Country", policyBuilder =>
{
policyBuilder.RequireClaim(ClaimTypes.Country);
});

上面我添加了一个策略,名字叫做Claim.Country.

因为不是默认,所以要[Authorize(Policy = "Claim.Country")]

policyBuilder 相当于上面的var defaultAuthBuilder = new AuthorizationPolicyBuilder();。

然后里面去设置起码有一个证书中要有国家。

policyBuilder 默认有一些限制可以使用,那么如何自己来定义呢?究竟是一种什么模式呢?

public class CustomRequireClaim:IAuthorizationRequirement
{
public CustomRequireClaim(string ClainType)
{
this.ClainType = ClainType;
} public string ClainType{ get; }
} public class CustomRequireClaimHandler : AuthorizationHandler<CustomRequireClaim>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomRequireClaim requirement)
{
var hasClaim = context.User.Claims.Any(u=>u.Type== requirement.ClainType);
if (hasClaim)
{
context.Succeed(requirement); }
return Task.CompletedTask;
}
}

CustomRequireClaim 是什么呢?继承IAuthorizationRequirement。其实是模拟生活中的什么呢,比如说你要向批发商进一匹东西,有一些需求,比如说苹果要通红的,你就可以在这里填写。

CustomRequireClaimHandler 继承自AuthorizationHandler,批发商带一批货(程序也就是用户带着证书来了),你可以这个检查合格不合格,拿着你的需求表对照。

那么注册进入:

config.AddPolicy("Claim.Country", policyBuilder =>
{
policyBuilder.AddRequirements(new CustomRequireClaim(ClaimTypes.Country));
});

同样需要:

services.AddScoped<IAuthorizationHandler, CustomRequireClaimHandler>();

这里就有疑问了,你这个policyBuilder.AddRequirements(new CustomRequireClaim(ClaimTypes.Country));就能调用到CustomRequireClaimHandler。

这个疑问简单化就是,你有一个需求,就只调用到检查类?

其实是在软件设计中,有这样一种套路,就是根据实体类,能自动调用执行类,这是一种设计模式。其实也能理解,就是呢,比如说公司有一张请假单,都标明是请假单了,肯定交给部门经理啊,AuthorizationHandler

<CustomRequireClaim>就是标记,处理CustomRequireClaim的。

在里面其实只有IAuthorizationHandler,但是根据CustomRequireClaim能实例出CustomRequireClaimHandler。所以也需要加上:

services.AddScoped<IAuthorizationHandler, CustomRequireClaimHandler>();

同样,回过头来,看下面的。

policyBuilder.RequireClaim(ClaimTypes.Country);

如何做到直接点出来,不用这种add的方式呢?也就是说我也想实现这样的。

policyBuilder.RequireCustomClaim(ClaimTypes.Country);

我要能RequireCustomClaim然后可以调用到我给的限制.

下面是使用扩展的方式实现:

public static class AuthorizationPolicyBuilderExtensions
{
public static AuthorizationPolicyBuilder RequireCustomClaim(this AuthorizationPolicyBuilder policyBuilder,string claimType)
{
policyBuilder.AddRequirements(new CustomRequireClaim(claimType));
return policyBuilder;
}
}

扩展一下AuthorizationPolicyBuilder 就可以,这样方便复用性。

以前的时候我们这样写:

[Authorize(Roles  = "admin")]

在这里就会检查我们的证书中是否有Roles 为admin。

然后呢,我们同样可以通过policy去实现。

config.AddPolicy("Claim.Role", policyBuilder =>
{
policyBuilder.RequireClaim(ClaimTypes.Role, "admin");
});

限制需要admin也是可以的,然后[Authorize(Policy= "Claim.Role")]。

具体看自己需求。

总结

后续继续写自己对认证授权理解。以上均为个人理解,如有误差,请指正。

.net core 认证与授权(三)的更多相关文章

  1. ASP.NET Core 认证与授权[3]:OAuth & OpenID Connect认证

    在上一章中,我们了解到,Cookie认证是一种本地认证方式,通常认证与授权都在同一个服务中,也可以使用Cookie共享的方式分开部署,但局限性较大,而如今随着微服务的流行,更加偏向于将以前的单体应用拆 ...

  2. ASP.NET Core 认证与授权[5]:初识授权

    经过前面几章的姗姗学步,我们了解了在 ASP.NET Core 中是如何认证的,终于来到了授权阶段.在认证阶段我们通过用户令牌获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥 ...

  3. ASP.NET Core 认证与授权[6]:授权策略是怎么执行的?

    在上一章中,详细介绍了 ASP.NET Core 中的授权策略,在需要授权时,只需要在对应的Controler或者Action上面打上[Authorize]特性,并指定要执行的策略名称即可,但是,授权 ...

  4. ASP.NET Core 认证与授权[1]:初识认证

    在ASP.NET 4.X 中,我们最常用的是Forms认证,它既可以用于局域网环境,也可用于互联网环境,有着非常广泛的使用.但是它很难进行扩展,更无法与第三方认证集成,因此,在 ASP.NET Cor ...

  5. ASP.NET Core 认证与授权[2]:Cookie认证

    由于HTTP协议是无状态的,但对于认证来说,必然要通过一种机制来保存用户状态,而最常用,也最简单的就是Cookie了,它由浏览器自动保存并在发送请求时自动附加到请求头中.尽管在现代Web应用中,Coo ...

  6. ASP.NET Core 认证与授权[1]:初识认证 (笔记)

    原文链接:  https://www.cnblogs.com/RainingNight/p/introduce-basic-authentication-in-asp-net-core.html 在A ...

  7. .net core 认证与授权(一)

    前言 .net core web并不是一个非常新的架构,很多文章提及到认证与授权这个过程,但是一般都会提及到里面的方法怎么用的,而不是模拟一个怎样的过程,所以我打算记录自己的理解. 什么是认证?我们大 ...

  8. 聊聊 asp.net core 认证和授权

    使用asp.net core 开发应用系统过程中,基本上都会涉及到用户身份的认证,及授权访问控制,因此了解认证和授权流程也相当重要,下面通过分析asp.net core 框架中的认证和授权的源码来分析 ...

  9. ASP.NET Core 认证与授权[7]:动态授权

    ASP.NET Core 中基于策略的授权旨在分离授权与应用程序逻辑,它提供了灵活的策略定义模型,在一些权限固定的系统中,使用起来非常方便.但是,当要授权的资源无法预先确定,或需要将权限控制到每一个具 ...

随机推荐

  1. 《美国纽约摄影学院摄影教材》PDF教材

        下载地址: 美国纽约摄影学院摄影教材(上册).pdf 美国纽约摄影学院摄影教材(下册).pdf 欢迎你到纽约摄影学院来,我们急切地等待着开课,你们也在 跃跃欲试了.那就让我们马上开始吧! 你已 ...

  2. 「UVA12004」 Bubble Sort 解题报告

    UVA12004 Bubble Sort Check the following code which counts the number of swaps of bubble sort. int f ...

  3. Linux环境下详细讲解部署MySQL5.7版本

    说明: 在本人写作这篇安装MySQL文章时,虽然MySQL已经发布到8.0.17版本,但对于行业来说,主力版本依然是5.7版本.目前在Linux环境默认安装时,大部分已经默认安装到8版本了,所以本人特 ...

  4. 查找2-n之间素数的个数

    题目描述 查找2-n之间素数的个数.n为用户输入值.素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数.如2,3,5,7,11,13,17…. 输入 整数n 输出 2-n ...

  5. js的内存泄漏场景、监控以及分析

    内存泄漏 Q:什么是内存泄漏? 字面上的意思,申请的内存没有及时回收掉,被泄漏了 Q:为什么会发生内存泄漏? 虽然前端有垃圾回收机制,但当某块无用的内存,却无法被垃圾回收机制认为是垃圾时,也就发生内存 ...

  6. Vue CLI及其vue.config.js(一)

    有时候我们为了快速搭建一个vue的完整系统,经常会用到vue-cli,vue-cli用起来很方便而且命令简单容易上手,但缺点是在构建的时候我感觉有一些慢,因为CLI 服务 (@vue/cli-serv ...

  7. Vue中echarts的基本用法

    前言:同大多数的前端框架一样,先读官网的使用方法.学会基本使用后,在实例中找到自己想要demo.拿过来改一改,一个echarts图表就形成,毕竟人家做就是为了方便使用. 我是在vue中下面直接使用的e ...

  8. 通过核心API启动单个或多个scrapy爬虫

    1. 可以使用API从脚本运行Scrapy,而不是运行Scrapy的典型方法scrapy crawl:Scrapy是基于Twisted异步网络库构建的,因此需要在Twisted容器内运行它,可以通过两 ...

  9. Go 每日一库之 viper

    简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...

  10. python 黏包现象

    一.黏包 1.tcp有黏包现象 表现两种情况 发送的数据过小且下面还有一个发送数据,这两个数据会一起发送 发送的数据过大,超过最大缓存空间,超出的部分在下一次发送的时候发送 原因: tcp是面向流的, ...