posts - 609,  comments - 13,  views - 64万
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

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才成立。

posted on   邢帅杰  阅读(867)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
点击右上角即可分享
微信分享提示