.Net Core Web API,如果角色或策略匹配,则授权操作

Posted

技术标签:

【中文标题】.Net Core Web API,如果角色或策略匹配,则授权操作【英文标题】:.Net Core Web API, Authorize a Action if Either of Role OR Policy Matches 【发布时间】:2019-06-12 13:54:19 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

要实现OR 条件,您可以使用接受RolePolicy 作为参数的自定义Authorize 属性。如果两者都不匹配,则返回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")]

对于多个角色/策略,您可以参考How to create a custom Authorize attribute for multiple policies in ASP.NET CORE

【讨论】:

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

以上是关于.Net Core Web API,如果角色或策略匹配,则授权操作的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT Token-Asp.net Core Identity 通过 Web API 上的角色声明进行授权

JWT不记名令牌授权不起作用asp net core web api

IdentityServer4 基于角色的 Web API 授权与 ASP.NET Core 身份

Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权

带有 Javascript 的 Dot Net Core Web API - CORS 策略错误

在 .Net Core 中为 WEB API 控制器定义不同的(不同于全局的)CORS 策略