且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

asp.net核心-将几个参数传递给自定义授权策略提供程序

更新时间:2023-02-17 10:08:28

对于自定义策略提供程序,它使用 LEMClaimAuthorizeAttribute 构建策略,然后检查生成的策略.为了将多个参数传递给 LEMClaimAuthorizeAttribute ,您需要注意生成策略字符串并从策略字符串提取策略的过程.

For Custom Policy Provider, it uses LEMClaimAuthorizeAttribute to build the Policy, and then check the generated policys. For passing multiple parameters to LEMClaimAuthorizeAttribute, you need to pay attention to the process to generate the policy string and extract policys from the policystring.

有关解决方案,请按照以下步骤操作:

For a solution, follow steps below:

  • LEMClaimAuthorizeAttribute.cs

  • LEMClaimAuthorizeAttribute.cs

public class LEMClaimAuthorizeAttribute : AuthorizeAttribute
{
public LEMClaimAuthorizeAttribute(ELocation[] eLocations, EEntity[] eEntities = null)
//public LEMClaimAuthorizeAttribute(ELocation[] eLocations)
{
    Locations = eLocations;
    Entitys = eEntities;
}
const string POLICY_PREFIX_ELocation = "LEMClaim.ELocation";
const string POLICY_PREFIX_EEntity = "LEMClaim.EEntity";

public ELocation[] Locations
{
    get
    {
        if (Enum.TryParse(typeof(ELocation[]), Policy.Substring(POLICY_PREFIX_ELocation.Length), out var locations))
        {
            return (ELocation[])locations;
        }

        return default(ELocation[]);
    }
    set
    {
        if (value != null)
        {
            int[] intVals = Array.ConvertAll(value, val => (int)val);
            string arrayVal = string.Join(",", intVals);

            Policy = Policy == null ? $"{POLICY_PREFIX_ELocation}{arrayVal}" : Policy + $";{POLICY_PREFIX_ELocation}{arrayVal}";
        }

    }
}
public EEntity[] Entitys
{
    get
    {
        if (Enum.TryParse(typeof(EEntity[]), Policy.Substring(POLICY_PREFIX_EEntity.Length), out var locations))
        {
            return (EEntity[])locations;
        }

        return default(EEntity[]);
    }
    set
    {
        if (value != null)
        {
            int[] intVals = Array.ConvertAll(value, val => (int)val);
            string arrayVal = string.Join(",", intVals);
            Policy = Policy == null ? $"{POLICY_PREFIX_EEntity}{arrayVal}" : Policy + $";{POLICY_PREFIX_EEntity}{arrayVal}";
        }
    }
}

//remaining code omitted for brevity
 }

  • LEMClaimRequirement.cs

  • LEMClaimRequirement.cs

    public class LEMClaimRequirement : IAuthorizationRequirement
    {
    public LEMClaimRequirement(ELocation[] eLocations, EEntity[] eEntities = null)
    {
        Locations = eLocations;
        Entitys = eEntities;
    }
    public ELocation[] Locations
    {
        get; set;
    }
    public EEntity[] Entitys
    {
        get; set;
    }
    }
    

  • LEMClaimPolicyProvider.cs

  • LEMClaimPolicyProvider.cs

    public class LEMClaimPolicyProvider : IAuthorizationPolicyProvider
    {
    const string POLICY_PREFIX = "LEMClaim";
    const string POLICY_PREFIX_ELocation = "LEMClaim.ELocation";
    const string POLICY_PREFIX_EEntity = "LEMClaim.EEntity";
    
    public DefaultAuthorizationPolicyProvider FallbackPolicyProvider { get; }
    
    public LEMClaimPolicyProvider(IOptions<AuthorizationOptions> options)
    {
        FallbackPolicyProvider = new DefaultAuthorizationPolicyProvider(options);
    }
    
    public Task<AuthorizationPolicy> GetDefaultPolicyAsync() => FallbackPolicyProvider.GetDefaultPolicyAsync();
    
    public Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
    {
        if (!policyName.StartsWith(POLICY_PREFIX, StringComparison.OrdinalIgnoreCase))
            return FallbackPolicyProvider.GetPolicyAsync(policyName);
        var val = policyName.Split(";");
        //get locations
        int[] ia1 = val.FirstOrDefault(k => k.StartsWith(POLICY_PREFIX_ELocation, StringComparison.OrdinalIgnoreCase))
                       .Substring(POLICY_PREFIX_ELocation.Length)
                       .Split(',').Select(n => Convert.ToInt32(n)).ToArray();
        ELocation[] locations = (ELocation[])(object)ia1;
        int[] ia2 = val.FirstOrDefault(k => k.StartsWith(POLICY_PREFIX_EEntity, StringComparison.OrdinalIgnoreCase))
                       ?.Substring(POLICY_PREFIX_EEntity.Length)
                       ?.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
        EEntity[] entitys = (EEntity[])(object)ia2;
    
        var policy = new AuthorizationPolicyBuilder();
        policy.AddRequirements(new LEMClaimRequirement(locations, entitys));
        return Task.FromResult(policy.Build());
    }
    }
    

  • 使用

  • Use

        [LEMClaimAuthorize(new ELocation[] { ELocation.Indy, ELocation.Columbus })]
    public ActionResult One()
    {
        return View();
    }
    [LEMClaimAuthorize(new ELocation[] { ELocation.Indy, ELocation.Columbus }, new EEntity[] { EEntity.JobTool })]
    public ActionResult Two()
    {
        return View();
    }