c# - .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)独立创建了自定义属性,但我再次无法将其与或条件
解决方案
要实现OR
条件,您可以使用接受Role
和Policy
作为参数的自定义授权属性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 中为多个策略创建自定义授权属性
推荐阅读
- firebase - 模式 ECB:实体可能只是在 DB 上?
- string - 在子目录中导入文件(嵌套字典)
- javascript - 如何通过 ssh 将 JS mqtt sub 和 pub 连接到 AWS EC2?
- reactjs - 定义了 useContext.Provider 的 useState 值
- python - ThreadPoolExecutor 正在泄漏内存
- php - Azure 应用服务的糟糕表现 - Wordpress
- java - 超类中没有参数的超函数Java
- javascript - 将数据发布到 Heroku 上的 Postgres 数据库后,React App 页面刷新到错误页面
- c# - 无法将类型“字符串”隐式转换为“布尔”请帮助我
- node.js - 错误:数据库“dbName”不存在 Node.js PostgreSQL