Я пытаюсь настроить провайдера настраиваемой политики в ядре asp.net.Мне нужно передать несколько пользовательских атрибутов авторизации провайдеру, но я не могу понять, как это сделать.
У меня настроен прием одного перечислимого массива в настоящее время, и он работает нормально.Однако я хотел бы добавить еще 2 массива enum в качестве дополнительных необязательных параметров для атрибута авторизации.
Атрибут в том виде, как он есть сейчас:
[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());
}
}
- Это работает только для одного перечислимого массива.
- Как мне заставить его работать с другими параметрами массива enum?
- Если есть способ получше, в общем у меня все уши
Спасибо за помощь!