Identity – Authorize Custom Authorization Policy Providers
前言
上一篇讲完了基本使用 Policy-Based. 这一篇另外说一说怎么动态调用它.
参考: Custom Authorization Policy Providers using IAuthorizationPolicyProvider in ASP.NET Core
需求和实现思路
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast21", policy =>
policy.Requirements.Add(new MinimumAgeRequirement(21)));
});
比如说 21 这个变量我想通过 SQL 输出可以吗?
Policy 和 Requirement 的关系可以都保存在 SQL 吗? 然后要改就改.
依据上面的代码来分析出实现手法的话, 大概可以这样做, 在 builder.Services 的期间, 发请求到 SQL,
然后通过反射调用执行完上面的所有代码. 这样应该就 ok 了. 但即便是这样, 由于是在 StartUp setup 1 time, 除非重启, 不然这些配置是能即刻被修改的.
那 ASP.NET Core 是否提供了更便利的接口呢?
有的, 那就是 Authorization Policy Providers
我们实现一个 Policy Provider, 它的职责是, 当有人要求一个 Policy 时 (by name), Provider 就提供一个 Policy 实例.
这个 Policy 实例, 要通过 SQL 还是任何复杂逻辑都可以. 一个工厂模式就对了.
具体实现
Create PolicyProvider
public class MyPolicyProvider : DefaultAuthorizationPolicyProvider
{
public MyPolicyProvider(IOptions<AuthorizationOptions> options) : base(options)
{
} public override Task<AuthorizationPolicy?> GetPolicyAsync(string policyName)
{
return base.GetPolicyAsync(policyName);
}
}
底层接口是

GetPolicyAsync 就是依据 PolicyName 获取 Policy
GetDefaultPolicyAsync 则是 [Authorize] 这种没有声明 Policy 的
GetFallbackPolicyAsync 和 GetDefaultPolicyAsync 一样, 都是没有声明 Policy 的 autho, 只是它用于 Authorization Middleware
一般上都是继承 DefaultAuthorizationPolicyProvider 然后 override GetPolicyAsync 就够用了
Register Provider
必须是 Singleton 哦
builder.Services.AddSingleton<IAuthorizationPolicyProvider, MyPolicyProvider>();
由于是 Singleton 可能会无法 inject scope service, 解决方案是 Implementing a custom IAuthorizationPolicyProvider with database access
然后, 每一次只要有需要 Policy, PolicyProvider.GetPolicyAsync 就会被调用.

常见用法

自定义一个 AuthorizeAttribute, 然后动态声明 PolicyName

在通过 custom policy provider, 把这个名字拆开取出 age, pass to AgeRequirement. 这样就形成了一个 dynamic age requirement 验证.
Identity – Authorize Custom Authorization Policy Providers的更多相关文章
- Custom Data Service Providers
Custom Data Service Providers Introduction Data Services sits above a Data Service Provider, which i ...
- ASP.NET Core3.1使用Identity Server4建立Authorization Server-2
前言 建立Web Api项目 在同一个解决方案下建立一个Web Api项目IdentityServer4.WebApi,然后修改Web Api的launchSettings.json.参考第一节,当然 ...
- ASP.NET Core3.1使用Identity Server4建立Authorization Server
前言 网上关于Identity Server4的资料有挺多的,之前是一直看杨旭老师的,最近项目中有使用到,在使用.NET Core3.1的时候有一些不同.所以在此记录一下. 预备知识: https:/ ...
- [转]How to: Create a Custom Principal Identity
本文转自:https://msdn.microsoft.com/en-us/library/aa702720(v=vs.110).aspx The PrincipalPermissionAttribu ...
- Filters in ASP.NET Core
Filters in ASP.NET Core allow code to be run before or after specific stages in the request processi ...
- Enable Cross-Origin Requests in Asp.Net WebApi 2[Reprint]
Browser security prevents a web page from making AJAX requests to another domain. This restriction i ...
- Enabling Cross-Origin Requests in ASP.NET Web API 2
Introduction This tutorial demonstrates CORS support in ASP.NET Web API. We’ll start by creating two ...
- Filters in ASP.NET Core (转自MSDN)
Filters in ASP.NET Core MVC allow you to run code before or after specific stages in the request pro ...
- 【ASP.NET Identity系列教程(一)】ASP.NET Identity入门
注:本文是[ASP.NET Identity系列教程]的第一篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...
- ASP.NET Identity 一 (转载)
来源:http://www.cnblogs.com/r01cn/p/5194257.html 注:本文是[ASP.NET Identity系列教程]的第一篇.本系列教程详细.完整.深入地介绍了微软的A ...
随机推荐
- Javascript克隆数据
JS 复制数据 1 浅复制 具体方法 // 数组 Array.prototype.slice // 普通对象 Object.assign 思考 2 深复制 1) function deepClone( ...
- [oeasy]python0127_中文系统_gbk_BIG5_南极星_内码转化
中文系统bgk 回忆上次内容 汉字字形通过 点阵式打字机 像素级寻址的屏幕 进入了计算机的世界 添加图片注释,不超过 140 字(可选) 在海峡对岸的台湾同胞 也进入了汉字时代 他 ...
- Visual Studio 必备插件集合:AI 助力开发
一.前言 2024年AI浪潮席卷全球,编程界迎来全新的挑战与机遇.智能编程.自动化测试.代码审查,这一切都得益于AI技术的迅猛发展,它正在重塑开发者的日常,让编写代码变得更加高效.智能. 精选出最受 ...
- Python 使用rsa类库基于RSA256算法生成JWT
JWT简介 JWT(Json web token),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.JWT提供了一种简单.安全的身份认证方法,特别适合分布式站点单点登录.或者是签名. ...
- 【Java】Spring5学习
基础环境与文档资料: 见黑马视频: https://www.bilibili.com/video/BV1P44y1N7QG 依赖坐标: <?xml version="1.0" ...
- 【RabbitMQ】10 深入部分P3 死信队列(交换机)
1.死信交换机 说是死信队列,是因为RabbitMQ和其他中间件产品不一样 有交换机的概念和这个东西存在,别的产品只有队列一说 DeadLetterExchange 消息成为DeadMessage之后 ...
- awk批量提取序列
在提取前需保证序列文件仅有一列! awk '{print$1}' input.fa > ouput.fa#就可将ID后面的其余注释信息去掉,仅保留ID 1 awk -F '>' 'NR=F ...
- Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
什么是面向对象编程 (OOP)? OOP 代表面向对象编程. 过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象. 与过程式编程相比,面向对象编程具有以下几个优势: ...
- SMU Summer 2023 Contest Round 12
SMU Summer 2023 Contest Round 12 A. K-divisible Sum 分类讨论: \(n > k\)时: \(n\)能整除\(k\)就全是\(1\) 不能整除, ...
- 微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)
这个接口只能获得一些非敏感信息,例如用户昵称,用户头像,经过用户授权允许获取的情况下即可获得用户信息,至于openid这些,需要调取wx.login来获取. index.wxml <!-- 当已 ...