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

标签 c# api security asp.net-core custom-attributes

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

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

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

我的大部分api都是专门为UI或者服务使用的,但是很少有API可以同时被UI和Service使用,但是面对,因此对于这样的API,我需要提供一个条件,比如Role或者Policy火柴,

例如,Authorize[Role="ABC", Policy="XYZ"] ,但是这个声明期望 Role 和 policy 都可以与 AND Condition 一起使用,但是我需要解决方案来实现与 OR 条件相同。如果有人遇到过这种情况,请帮助我。

仅供引用,我尝试过使用自定义属性,但没有成功,因为我有为角色(使用 AuthorizeAttribute)策略(使用 TypeFilterAttribute 和 IAsyncAuthorizationFilter)独立创建的自定义属性),但我还是无法将相同条件与 OR 条件结合起来

最佳答案

要实现 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

关于c# - .Net Core Web API,如果角色或策略匹配则授权操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56563905/

相关文章:

c# - 将字符串解析为 LINQ 查询

winapi - 为商业应用程序 Hook Win32 API 的推荐方法是什么?

java - CRL 处理中比较 interim_reasons_mask 和reasons_mask 的原因

c# - 如何从一个 Visual Studio 项目创建两个不同的可执行文件

c# - 如何为 XmlElement 指定不同于其构造函数中的默认值?

javascript - 如何使用 HTML、jQuery、数字 API

java - 为什么我应该使用 JAAS 来对抗手写安全性?

java - 如何使 Java EE 中的授权可外部重新配置(在 war 文件之外)并可热重新配置?

c# - 为什么需要为部分 View 提供完整路径

iphone - 关于通过私有(private) API 在 iOS 上打开的 URL 和被叫号码的信息?