前言

上一篇讲完了基本使用 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的更多相关文章

  1. Custom Data Service Providers

    Custom Data Service Providers Introduction Data Services sits above a Data Service Provider, which i ...

  2. ASP.NET Core3.1使用Identity Server4建立Authorization Server-2

    前言 建立Web Api项目 在同一个解决方案下建立一个Web Api项目IdentityServer4.WebApi,然后修改Web Api的launchSettings.json.参考第一节,当然 ...

  3. ASP.NET Core3.1使用Identity Server4建立Authorization Server

    前言 网上关于Identity Server4的资料有挺多的,之前是一直看杨旭老师的,最近项目中有使用到,在使用.NET Core3.1的时候有一些不同.所以在此记录一下. 预备知识: https:/ ...

  4. [转]How to: Create a Custom Principal Identity

    本文转自:https://msdn.microsoft.com/en-us/library/aa702720(v=vs.110).aspx The PrincipalPermissionAttribu ...

  5. Filters in ASP.NET Core

    Filters in ASP.NET Core allow code to be run before or after specific stages in the request processi ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 【ASP.NET Identity系列教程(一)】ASP.NET Identity入门

    注:本文是[ASP.NET Identity系列教程]的第一篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...

  10. ASP.NET Identity 一 (转载)

    来源:http://www.cnblogs.com/r01cn/p/5194257.html 注:本文是[ASP.NET Identity系列教程]的第一篇.本系列教程详细.完整.深入地介绍了微软的A ...

随机推荐

  1. <script> 和 <script setup> 的一些主要差别

    <script setup> 是 Vue 3 中的新特性,它是一种简化和更具声明性的语法,用于编写组件的逻辑部分.相比之下,<script> 是 Vue 2 中常用的编写组件逻 ...

  2. [oeasy]python0018_ ASCII_字符分布_数字_大小写字母_符号_黑暗森林

    ​ 打包和解包 回忆上次内容 decode 就是解码 解码和编码可以转化 encode 编码 decode 解码 互为逆过程 大小写字母之间序号全都相差(​​32​​)​​10进制​​ ​ 编辑 这是 ...

  3. C# 算术表达式求值(后缀法),看这一篇就够了

    一.种类介绍 算术表达式有三种:前缀表达式.中缀表达式和后缀表达式.一般用的是中缀,比如1+1,前后缀就是把操作符移到前面和后面,下面简单介绍一下这三种表达式. 1.前缀表示法 前缀表示法又叫波兰表示 ...

  4. C#从6.0~9.0都更新了什么?

    一.C#6中新增的功能 get 只读属性 简洁的语法来创建不可变类型,仅有get访问器: public string FirstName { get; } public string LastName ...

  5. AI知识库这事儿FastGPT是专业的

    在搭建AI知识库这事儿上,有不少成熟的框架,我推荐使用FastGPT.这篇文章笔者就使用过的两款平台做个比较,FastGPT和百度千帆平台. 1. 为什么要搭建知识库 随着企业的运营,企业的私有数据越 ...

  6. 解决Prism中对话框服务中对话框开启时回调函数不会触发的问题

    解决办法 新建一个类DialogServiceExtend,然后在再注册 public class DialogServiceExtend : DialogService { public Dialo ...

  7. Python+requests编写接口用例

    1.python编写接口用例需要依赖requests模块,我们先确认本地是否安装了requests模块,没有安装的先进行安装. pycharm工具查看已安装的模块:File->Setting-& ...

  8. 【Spring】07 后续的学习补充 vol1

    控制反转Inverse Of Control的演变: 在之前的原生Javaweb项目的问题: 我们三层架构每一层之间的联系是这样的: 由GradeDao接口指向GradeDaoImpl 再由Grade ...

  9. vim跳转到上次和下次光标位置

    在vim的命令模式下: ctrl + i    下次光标位置; ctrl + o   上次光标位置. =====================================

  10. java中获取本机IP

    1.背景 2.代码 package com.XXX.common.util; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4 ...