网站首页 网站源码
namespace Dpz.Core.WebApi.Middleware;
/// <summary>
/// 权限策略
/// </summary>
public class PermissionRequirement
: AuthorizationHandler<PermissionRequirement>,
IAuthorizationRequirement
{
private readonly Permissions _permission;
/// <summary>
/// ctor
/// </summary>
/// <param name="permission"></param>
public PermissionRequirement(Permissions permission)
{
_permission = permission;
}
/// <summary>
/// 处理权限
/// </summary>
/// <param name="context"></param>
/// <param name="requirement"></param>
/// <returns></returns>
/// <exception cref="System.NotImplementedException"></exception>
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
PermissionRequirement requirement
)
{
context.User.GetIdentity();
if (!context.User.HasClaim(x => x.Type == "Permissions"))
{
context.Fail();
return Task.CompletedTask;
}
var permissionValue = context.User.FindFirst(x => x.Type == "Permissions")?.Value;
if (
string.IsNullOrEmpty(permissionValue)
|| !Enum.TryParse(typeof(Permissions), permissionValue, out var permission)
)
{
context.Fail();
return Task.CompletedTask;
}
var userFlags = permission?.ToString()?.Split(",")?.Select(x => x.Trim())?.ToList();
var flags = _permission.ToString().Split(",").Select(x => x.Trim()).ToList();
if (flags.Any(flag => userFlags != null && !userFlags.Contains(flag)))
{
context.Fail();
return Task.CompletedTask;
}
context.Succeed(requirement);
return Task.CompletedTask;
}
}
internal static class ApiPermission
{
/// <summary>
/// 系统最高权限
/// </summary>
public const string System = "System";
}
上述代码定义了一个权限策略的实现,主要用于在 ASP.NET Core Web API 中进行权限验证。以下是代码的主要组成部分和功能解释:
PermissionRequirement
类IAuthorizationRequirement
接口,并继承自 AuthorizationHandler<PermissionRequirement>
,用于处理特定的权限要求。Permissions
类型的参数,表示所需的权限。HandleRequirementAsync
方法AuthorizationHandlerContext
和 PermissionRequirement
,前者包含了当前的授权上下文,后者是当前的权限要求。context.Fail()
方法表示授权失败。Permissions
枚举类型。如果解析失败或值为空,调用 context.Fail()
。context.Fail()
。context.Succeed(requirement)
表示授权成功。ApiPermission
类System
的常量,表示系统最高权限。整体上,这段代码实现了一个自定义的权限验证机制,允许开发者在 Web API 中根据用户的权限声明来控制访问。通过实现 IAuthorizationRequirement
接口和重写 HandleRequirementAsync
方法,开发者可以灵活地定义和检查用户的权限。