[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited =true)] //类名称可以改,因为我把系统操作当作资源来管理
public class ResourceAttribute:AuthorizeAttribute
{
private string _resouceName;
private string _action;
public ResourceAttribute(string name)
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentNullException(nameof(name));
}
_resouceName = name;
//把资源名称设置成Policy名称
Policy = _resouceName;
}
public string GetResource()
{
return _resouceName;
}
public string Action
{
get
{
return _action;
}
set
{
_action = value;
if (!string.IsNullOrEmpty(value))
{ //把资源名称跟操作名称组装成Policy
Policy = _resouceName + "-" + value;
}
}
}
}
public class ResourceAuthorizationPolicyProvider : IAuthorizationPolicyProvider
{
private AuthorizationOptions _options;
public ResourceAuthorizationPolicyProvider(IOptions<authorizationoptions> options)
{
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
_options = options.Value;
}
public Task<authorizationpolicy> GetDefaultPolicyAsync()
{
return Task.FromResult(_options.DefaultPolicy);
}
public Task<authorizationpolicy> GetPolicyAsync(string policyName)
{
AuthorizationPolicy policy = _options.GetPolicy(policyName); //因为我们policy的名称其实就是对应的权限名称,所以可以用下列逻辑返回需要的验证规则
if (policy == null)
{
string[] resourceValues = policyName.Split(new char[] { '-' }, StringSplitOptions.None);
if (resourceValues.Length == 1)
{
_options.AddPolicy(policyName, builder =>
{
builder.AddRequirements(new ClaimsAuthorizationRequirement(resourceValues[0], null));
});
}
else
{
_options.AddPolicy(policyName, builder =>
{
builder.AddRequirements(new ClaimsAuthorizationRequirement(resourceValues[0], new string[] { resourceValues[1] }));
});
}
}
return Task.FromResult(_options.GetPolicy(policyName));
}
}
</authorizationpolicy></authorizationpolicy></authorizationoptions>
public class ResourceApplicationModelProvider : IApplicationModelProvider
{
private readonly IAuthorizationPolicyProvider _policyProvider;
public ResourceApplicationModelProvider(IAuthorizationPolicyProvider policyProvider)
{
_policyProvider = policyProvider;
}
public void OnProvidersExecuted(ApplicationModelProviderContext context)
{
}
public void OnProvidersExecuting(ApplicationModelProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
List<resourceattribute> attributeData = new List<resourceattribute>(); //循环获取所有的控制器
foreach (var controllerModel in context.Result.Controllers)
{ //得到ResourceAttribute
var resourceData = controllerModel.Attributes.OfType<resourceattribute>().ToArray();
if (resourceData.Length > 0)
{
attributeData.AddRange(resourceData);
}
//循环控制器方法
foreach (var actionModel in controllerModel.Actions)
{ //得到方法的ResourceAttribute
var actionResourceData = actionModel.Attributes.OfType<resourceattribute>().ToArray();
if (actionResourceData.Length > 0)
{
attributeData.AddRange(actionResourceData);
}
}
}
//把所有的resourceattribute的信息写到一个全局的resourcedata中,resourcedata就可以在其他地方进行使用,resourcedata定义后面补充
foreach (var item in attributeData)
{
ResourceData.AddResource(item.GetResource(), item.Action);
}
}
public int Order { get { return -1000 + 11; } }
}
</resourceattribute></resourceattribute></resourceattribute></resourceattribute>
public class ResourceData
{
static ResourceData()
{
Resources = new Dictionary<string, List<string>>();
}
public static void AddResource(string name)
{
AddResource(name, "");
}
public static void AddResource(string name,string action)
{
if (string.IsNullOrEmpty(name))
{
return;
}
if (!Resources.ContainsKey(name))
{
Resources.Add(name, new List<string>());
}
if (!string.IsNullOrEmpty(action) && !Resources[name].Contains(action))
{
Resources[name].Add(action);
}
}
public static Dictionary<string, List<string>> Resources { get; set; }
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有