c# - 根据策略列表授权
问题描述
我正在研究不同的应用程序,每个应用程序都有自己的角色成员。
在 Startup.cs
var c= _configuration.GetSection(nameof(Configuration)).Get<List<Configuration>>();
foreach (Configuration r in c)
{
services.AddAuthorization(options => {
options.AddPolicy(Configuration.Role, policy =>
policy.RequireRole(r.RoleMembers.Split(",")));
});
}
下面的代码不起作用,因为我指的是一个数组。
[Authorize(Policy = Configuration.Role)]
如何授权第 0 个元素?
解决方案
您可以为多个策略实现自定义 AuthorizeAttribute。
1.AuthorizeMultiplePolicyAttribute
public class AuthorizeMultiplePolicyAttribute : TypeFilterAttribute
{
public AuthorizeMultiplePolicyAttribute(string[] policies) : base(typeof(AuthorizeMultiplePolicyFilter))
{
Arguments = new object[] { policies };
}
}
2.AuthorizeMultiplePolicyFilter
public class AuthorizeMultiplePolicyFilter : IAsyncAuthorizationFilter
{
private readonly IAuthorizationService _authorization;
public string[] _policies { get; private set; }
public AuthorizeMultiplePolicyFilter(string[] policies,IAuthorizationService authorization)
{
_policies = policies;
_authorization = authorization;
}
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
foreach (var policy in _policies)
{
var authorized = await _authorization.AuthorizeAsync(context.HttpContext.User, policy);
if (!authorized.Succeeded)
{
context.Result = new ForbidResult();
return;
}
}
}
}
3.在启动时一一添加你想要的策略
services.AddAuthorization(options =>
{
//register all policies based on your own code,give them different policy name
options.AddPolicy("AdminPolicy", policy =>
policy.RequireRole("Admin"));
options.AddPolicy("SuperPolicy", policy =>
policy.RequireRole("Super"));
});
4.使用自定义属性
[AuthorizeMultiplePolicy(new string[] { "AdminPolicy", "SuperPolicy" })]
推荐阅读
- haskell - 为什么绑定运算符与不完整的 lambda 函数一起使用?
- python - 使用指定数量的训练数据进行交叉验证?
- python - 沿 z 轴的中位数堆叠两个 3D numpy 数组并保持较小数组的大小
- sql - 是否可以使用 excel 单元格值 - 作为 T-SQL 语句中的参考?
- flutter - 颤振搜索带有空格的希伯来语(从左到右)联系人不起作用
- python - python Firebase Cloud Storage - 上传文件而不将其保存在本地
- python - gspread 中每个用户每 100 秒的读取请求限制超出配额,但 Console Cloud Google 仅显示 24 个请求
- python - 在dict中添加每个项目的价值
- flutter - Flutter:Filterchip未更新表单中检查的初始值
- c# - 背景颜色 c# interpo