1.注册策略、使用Claim
services.AddAuthorization(options => { options.AddPolicy("AlbumEdit", policy => { policy.RequireClaim("AlbumEditClaim"); }); }); [Authorize(Policy = "AlbumEdit")]//使用
2.获取用户的Claims:var claims = await _userManager.GetClaimsAsync(user);
3.自定义策略,一个Requirement可以编写多个Handler,多个Handler如果有一个返回了Fail,则策略不满足;如果所有Handler都没有返回Fail,只要有一个Handler返回了Succeed,策略就满足。
using Microsoft.AspNetCore.Authorization; using System.Linq; using System.Threading.Tasks; namespace NetCoreTestMVC2.Auth { /// <summary> /// 策略类 /// </summary> public class EmailRequirement : IAuthorizationRequirement { public string RequiredEmail { get; set; } public EmailRequirement(string requiredEmail) { RequiredEmail = requiredEmail; } } public class EmailHandler : AuthorizationHandler<EmailRequirement> { protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, EmailRequirement requirement) { var claim = context.User.Claims.FirstOrDefault(x => x.Type == "Email"); if (claim != null) { if (claim.Value.EndsWith(requirement.RequiredEmail)) { context.Succeed(requirement); } } return Task.CompletedTask; } } }
//注册自定义策略 Handler
services.AddSingleton<IAuthorizationHandler, EmailHandler>();
4.使用
services.AddAuthorization(options => { //自定义策略 options.AddPolicy("test", policy => { policy.RequireAssertion(context => { if (context.User.HasClaim(x => x.Type == "AlbumEdit")) { return true; } return false; }); }); //自定义策略类 options.AddPolicy("test", policy => { policy.AddRequirements(new EmailRequirement("@qq.com")); }); });
policy.AddRequirements中可以new多个Requirement,必须同时满足所有Requirement才成立。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】