簡體   English   中英

asp.net核心-將幾個參數傳遞給自定義授權策略提供程序

[英]asp.net core - pass several parameters to custom authorization policy provider

我正在嘗試在asp.net核心中設置自定義策略提供程序。 我需要將幾個自定義授權屬性傳遞給提供者,但在如何做到這一點上卻很掙扎。

我已將其設置為當前接受一個枚舉數組,並且工作正常。 但是,我想再添加2個枚舉數組作為授權屬性的其他可選參數。

現在的屬性:

[LEMClaimAuthorize(new ELocation[] { ELocation.Indy, ELocation.Columbus })]

希望它像這樣工作:

[LEMClaimAuthorize(new ELocation[] { ELocation.Indy, ELocation.Columbus },
                                           new EEntity[] { EEntity.JobTool })]

LEMClaimAuthorizeAttribute是:

public class LEMClaimAuthorizeAttribute : AuthorizeAttribute
{
    const string POLICY_PREFIX = "LEMClaim";

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

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

            Policy = $"{POLICY_PREFIX}{arrayVal}";
        }
    }

//remaining code omitted for brevity
}

定制授權策略提供者:

public class LEMClaimPolicyProvider : IAuthorizationPolicyProvider
{
    const string POLICY_PREFIX = "LEMClaim";
    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);

        string val = policyName.Substring(POLICY_PREFIX.Length);

        //CONVERT STRING TO INT[]
        int[] ia = val.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
        ELocation[] locations = (ELocation[])(object)ia;

        var policy = new AuthorizationPolicyBuilder();
        policy.AddRequirements(new LEMClaimRequirement(locations));
        return Task.FromResult(policy.Build());


    }
}
  1. 這僅適用於一個枚舉數組。
  2. 如何使其與其他枚舉數組參數一起使用?
  3. 如果有更好的方法,總的來說,我很高興

謝謝您的幫助!

對於Custom Policy Provider ,它使用LEMClaimAuthorizeAttribute來構建Policy,然后檢查生成的策略。 為了將多個參數傳遞給LEMClaimAuthorizeAttribute ,您需要注意生成策略字符串和從策略字符串提取策略的過程。

有關解決方案,請按照以下步驟操作:

  • 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

     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

     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()); } } 
  • 采用

      [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(); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM