C# .Net核心Web API,如果角色或策略匹配,则授权操作

C# .Net核心Web API,如果角色或策略匹配,则授权操作,c#,api,security,asp.net-core,custom-attributes,C#,Api,Security,Asp.net Core,Custom Attributes,我使用.NETCore开发了RESTAPI,我的API由两个源使用,一个来自UI,另一个来自服务 对于授权UI,我在声明中使用了JWToken方法,而对于服务,我使用了基于角色的集成安全授权 i、 例如,对于UI,我需要提供[Authorize(Policy=“XYZ”)] 至于服务,我需要提供[授权(Role=“ABC”)] 我的大多数API都是由UI或服务专门使用的,但是很少有API可以由UI和服务同时使用,但是面向,因此对于这样的API,我需要提供一个条件,比如角色匹配或策略匹配 例如,授

我使用.NETCore开发了RESTAPI,我的API由两个源使用,一个来自UI,另一个来自服务

对于授权UI,我在声明中使用了JWToken方法,而对于服务,我使用了基于角色的集成安全授权

i、 例如,对于UI,我需要提供[Authorize(Policy=“XYZ”)] 至于服务,我需要提供[授权(Role=“ABC”)]

我的大多数API都是由UI或服务专门使用的,但是很少有API可以由UI和服务同时使用,但是面向,因此对于这样的API,我需要提供一个条件,比如角色匹配或策略匹配

例如,授权[Role=“ABC”,Policy=“XYZ”],但该语句期望角色和策略在和条件下都可用,但我需要解决方案来实现相同的类型或条件。如果有人遇到过这种情况,请帮助我


仅供参考,我尝试过使用自定义属性,但没有成功,因为我为角色(使用AuthorizeAttribute)策略(使用TypeFilterAttribute和IAsyncAuthorizationFilter)单独创建了自定义属性,但同样,我无法将相同的属性与或条件结合起来以实现
条件,您可以使用自定义授权属性,该属性接受
角色
策略
作为参数。如果两者都不匹配,则返回
403

下面是一个简单的演示:

1.创建一个
authorizedMultiplePolicyAttribute

public class AuthorizeMultiplePolicyAttribute : TypeFilterAttribute
{
    public AuthorizeMultiplePolicyAttribute(string role, string policy) : base(typeof(AuthorizeMultiplePolicyFilter))
    {
        Arguments = new object[] { role, policy };
    }
}
2.创建
authorizedMultiplePolicyFilter

public class AuthorizeMultiplePolicyFilter : IAsyncAuthorizationFilter
{
    private readonly IAuthorizationService _authorization;
    public string _role { get; private set; }
    public string _policy { get; private set; }

    public AuthorizeMultiplePolicyFilter(string role, string policy, IAuthorizationService authorization)
    {
        _role = role;
        _policy = policy;
        _authorization = authorization;

    }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var policyAuthorized = await _authorization.AuthorizeAsync(context.HttpContext.User, _policy);
        var roleAuthorized = context.HttpContext.User.IsInRole(_role);

        if(!policyAuthorized.Succeeded && !roleAuthorized)
        {
            context.Result = new ForbidResult();
            return;
        }

    }
}
3.使用自定义属性

[AuthorizeMultiplePolicy("Admin","XYZ")]

对于多个角色/策略,您可以参考

我有相同的授权策略代码,但使用IsInRole行的新代码,授权角色对角色不起作用,原因是,对于角色,请求不通过JWT令牌,而是通过具有集成安全性的服务,例如,从服务HTTPCLientHandler请求,UseDefaultCredentials=true,并在.Net core api启动中设置为Options.DefaultChallengeScheme=IISDefaults.AuthenticationScheme;设定