• .NET Core Policy和Claim


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

  • 相关阅读:
    Flask--目录
    Linux相关目录
    Mac 提示错误”xcrun: error“
    subprocess模块
    压缩模块
    GitPython模块
    Ansible-ansible命令
    YAML语法
    Ansible-安装
    Ansible-概念
  • 原文地址:https://www.cnblogs.com/xsj1989/p/13841425.html
Copyright © 2020-2023  润新知