首页 > 解决方案 > .Net Core Web API,如果角色或策略匹配,则授权操作

问题描述

我使用 .Net Core 开发了 Rest API,我的 API 由两个来源使用,一个来自 UI,另一个来自服务。

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

即,对于 UI,我需要提供[Authorize(Policy="XYZ")] 而对于服务,我需要提供[Authorize(Role="ABC")]

我的大多数 api 要么专门由 UI 或服务使用,但是 UI 和服务都可以使用的 API 很少,但是面对,因此对于此类 API,我需要提供角色或策略匹配等条件,

例如,Authorize[Role="ABC", Policy="XYZ"],但此语句期望角色和策略都可用于 AND 条件,但我需要解决方案来实现与 OR 条件相同的类型。如果有人遇到过这种情况,请帮助我。

仅供参考,我曾尝试使用自定义属性,但没有成功,因为我为角色(使用 AuthorizeAttribute)策略(使用 TypeFilterAttribute 和 IAsyncAuthorizationFilter)独立创建了自定义属性,但我再次无法将其与或条件

标签: c#apisecurityasp.net-corecustom-attributes

解决方案


要实现OR条件,您可以使用接受RolePolicy作为参数的自定义授权属性403。如果它们都不匹配,则返回。

下面是一个简单的演示:

1.创建一个AuthorizeMultiplePolicyAttribute

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

2.创建AuthorizeMultiplePolicyFilter

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")]

对于多个角色/策略,您可以参考如何在 ASP.NET CORE 中为多个策略创建自定义授权属性


推荐阅读