-
.NET Core 之 自定义策咯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
services.AddAuthorization(options => { options.AddPolicy( "AdminPolicy" , policyBuilder => policyBuilder .RequireRole( "Admin" ) //Claim的Role是Admin .RequireUserName( "Eleven" ) //Claim的Name是Eleven .RequireClaim(ClaimTypes.Email) //必须有某个Cliam //.Combine(qqEmailPolicy) ); //内置 options.AddPolicy( "UserPolicy" , policyBuilder => policyBuilder.RequireAssertion(context => context.User.HasClaim(c => c.Type == ClaimTypes.Role) && context.User.Claims.First(c => c.Type.Equals(ClaimTypes.Role)).Value == "Admin" ) //.Combine(qqEmailPolicy) ); //自定义 //policy层面 没有Requirements //options.AddPolicy("QQEmail", policyBuilder => policyBuilder.Requirements.Add(new QQEmailRequirement())); options.AddPolicy( "DoubleEmail" , policyBuilder => policyBuilder.Requirements.Add( new DoubleEmailRequirement())); }); services.AddSingleton<IAuthorizationHandler, ZhaoxiMailHandler>(); services.AddSingleton<IAuthorizationHandler, QQMailHandler>(); |
上面是系统自带的策略,但是这种情况可能比较鸡肋。那么自定义策略使得比较灵活。
自定义 策略,继承 IAuthorizationRequirement,在 HandleRequirementAsync 实现自己自定义的策略规则,比如下面是实现用户信息,支持2种用户邮箱才允许访问特定页面或接口等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
/// <summary> /// 两种邮箱都能支持 /// /// </summary> public class DoubleEmailRequirement : IAuthorizationRequirement { } public class QQMailHandler : AuthorizationHandler<DoubleEmailRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DoubleEmailRequirement requirement) { if (context.User != null && context.User.HasClaim(c => c.Type == ClaimTypes.Email)) { var email = context.User.FindFirst(c => c.Type == ClaimTypes.Email).Value; if (email.EndsWith( "@qq.com" , StringComparison.OrdinalIgnoreCase)) { context.Succeed(requirement); } else { //context.Fail();//不设置失败 } } return Task.CompletedTask; } } public class ZhaoxiMailHandler : AuthorizationHandler<DoubleEmailRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DoubleEmailRequirement requirement) { if (context.User != null && context.User.HasClaim(c => c.Type == ClaimTypes.Email)) { var email = context.User.FindFirst(c => c.Type == ClaimTypes.Email).Value; if (email.EndsWith( "@ZhaoxiEdu.Net" , StringComparison.OrdinalIgnoreCase)) { context.Succeed(requirement); } else { //context.Fail(); } } return Task.CompletedTask; } } |
1
|
登录过后,会根据用户信息对比策略中信息。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[Authorize(AuthenticationSchemes = "Cookies" , Policy = "AdminPolicy" )] public IActionResult InfoAdminPolicy() { return View(); } [Authorize(AuthenticationSchemes = "Cookies" , Policy = "UserPolicy" )] public IActionResult InfoUserPolicy() { return View(); } [Authorize(AuthenticationSchemes = "Cookies" , Policy = "QQEmail" )] public IActionResult InfoQQEmail() { return View(); } [Authorize(AuthenticationSchemes = "Cookies" , Policy = "DoubleEmail" )] public IActionResult InfoDoubleEmail() { return View(); } |
用户登录 信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
[AllowAnonymous] public async Task<IActionResult> LoginCustomScheme( string name, string password) { //base.HttpContext.RequestServices. //IAuthenticationService if ( "ElevenCustomScheme" .Equals(name, StringComparison.CurrentCultureIgnoreCase) && password.Equals( "123456" )) { var claimIdentity = new ClaimsIdentity( "Custom" ); claimIdentity.AddClaim( new Claim(ClaimTypes.Name, name)); claimIdentity.AddClaim( new Claim(ClaimTypes.Email, "xuyang@ZhaoxiEdu.Net" )); await base .HttpContext.SignInAsync( "CustomScheme" , new ClaimsPrincipal(claimIdentity), new AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddMinutes(30), }); //登录为默认的scheme cookies return new JsonResult( new { Result = true , Message = "登录成功" }); } else { await Task.CompletedTask; return new JsonResult( new { Result = false , Message = "登录失败" }); } } |
出处:https://www.cnblogs.com/lyl6796910/p/14424278.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数