Galosys.Foundation.AspNetCore.Authorization
26.9.23.1
dotnet add package Galosys.Foundation.AspNetCore.Authorization --version 26.9.23.1
NuGet\Install-Package Galosys.Foundation.AspNetCore.Authorization -Version 26.9.23.1
<PackageReference Include="Galosys.Foundation.AspNetCore.Authorization" Version="26.9.23.1" />
<PackageVersion Include="Galosys.Foundation.AspNetCore.Authorization" Version="26.9.23.1" />
<PackageReference Include="Galosys.Foundation.AspNetCore.Authorization" />
paket add Galosys.Foundation.AspNetCore.Authorization --version 26.9.23.1
#r "nuget: Galosys.Foundation.AspNetCore.Authorization, 26.9.23.1"
#:package Galosys.Foundation.AspNetCore.Authorization@26.9.23.1
#addin nuget:?package=Galosys.Foundation.AspNetCore.Authorization&version=26.9.23.1
#tool nuget:?package=Galosys.Foundation.AspNetCore.Authorization&version=26.9.23.1
Galosys.Foundation.AspNetCore.Authorization
ASP.NET Core 授权适配层(PEP,Policy Enforcement Point):将官方授权管线接线到核心引擎 Galosys.Foundation.Authorization 的统一授权模型。ACL / RBAC / ABAC / ReBAC 规则都表达为核心 PolicyRule,由同一个 IAuthorizationEngine 评估——本适配层不做模型区分,仅负责 Web 场景的桥接(声明式 [Authorize] / 命令式扩展 / HttpContext 环境属性源)。
设计文档:
docs/designs/abac-design.md(终局设计 §3.3 双包分层);核心包(PDP)见Galosys.Foundation.Authorization。
能力清单
| 能力 | 说明 |
|---|---|
| 声明式授权 | [Authorize(Policy="...")],policy 名即策略名,动态策略提供者无需预注册 |
| Handler 接线 | AuthorizationEngineHandler 组装核心 AuthorizationRequest → IAuthorizationEngine.EvaluateAsync → 富决策 AuthorizationDecision(Succeed / Fail + DenyReason) |
| 动态策略提供者 | AuthorizationEnginePolicyProvider:任意策略名动态构造含 AuthorizationEngineRequirement 的策略 |
| 命令式扩展 | IAuthorizationService.AuthorizeAsync 两个重载(ClaimsPrincipal / 显式四要素,Worker 零 HttpContext) |
| env 外部属性源 | IEnvironmentAttributeSource / HttpContextAttributeSource(env.SourceIp/env.UserAgent),随 AddAuthorizationEngine() 自动装配(Worker 下 HttpContext 为 null 安全回退) |
| 组合装配(自含) | AddAuthorizationEngine() = 官方 AddAuthorization()(IAuthorizationService)+ 核心 AddAuthorizationEngineCore() + 适配组件,HttpContext 属性源自动注册,全部 TryAdd 可覆盖 |
| 策略存储桥 | 「引入包即替换」:RemoveAll<IAuthorizationPolicyRepository> + Add<T>() 替换核心仓库(业务桥实现核心接口,动态模式) |
统一模型(ACL / RBAC / ABAC 无需区分)
适配层背后的核心引擎不区分规则类型——ACL 即 Conditions 为空的 PolicyRule:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Principal": ["user:alice"],
"Action": ["doc:Read"],
"Resource": ["acs:doc:*:*:report/123"]
}
]
}
PolicyRule 可选 Category 元数据("acl"/"rbac"/"abac"/"rebac"),仅用于管理界面分类,引擎评估忽略。Agent / Worker 直接引用核心包即可评估全部模型,无需任何额外组件。
使用示例
注册(Web,自含装配)
services.AddAuthorizationEngine(options =>
{
options.PollingInterval = TimeSpan.FromSeconds(30); // 热更新轮询
options.Policies = new[] { policyRule }; // 核心 AuthorizationEngineOptions,或 PolicyFilePath / PolicySection
});
// 自含:官方 IAuthorizationService、动态策略提供者、授权处理器、HttpContext 环境属性源均已自动注册,无需额外调用
声明式(接口级授权)
[Authorize(Policy = "orders:edit")] // policy 名即策略名,无需预注册
public async Task<UnifiedResponse> EditOrder(OrderUpdateCommand command) { ... }
命令式(资源级)
var result = await _authorizationService.AuthorizeAsync(User, order, "orders:approve");
if (!result.Succeeded) return UnifiedResponse.Fail("无权限");
显式四要素(Worker/Agent,零 HttpContext)
var decision = await _authorizationService.AuthorizeAsync(
new Subject("alice").WithAttr("roleIds", new[] { "admin" }),
order, "orders:edit",
new EnvironmentContext().WithAttr("SourceIp", "10.1.2.3"));
替换策略存储(业务桥,引入包即替换)
services.AddAuthorizationEngine();
services.RemoveAll<IAuthorizationPolicyRepository>();
services.AddSingleton<IAuthorizationPolicyRepository, BopAbacPolicyStore>(); // 实现核心接口(动态模式)
扩展点契约:核心注册全 TryAdd(宿主先注册不被覆盖);集成包在基础之后以
RemoveAll+Add替换仓库/引擎,或以TryAddEnumerable追加属性提供者。Casbin 引擎替换、DataPermission 属性提供者均按此契约由独立集成包装配。
业务桥(动态模式,模板对齐参考)
模板若已有自有 RBAC schema(Resource / RoleResource 式:资源承载 Perms,资源↔角色/Agent 绑定),可让 Resource.Perms 直接成为策略名,用业务仓储实现 IAuthorizationPolicyRepository 动态组装 PolicyRule——无需数据迁移,也无需编写 Handler:
// 每个资源的每个权限码生成一条规则:Id/Actions = Perm,Principals = 绑定该资源的全部主体(role:* / agent:*)
public sealed class BopAbacPolicyStore : IAuthorizationPolicyRepository
{
private readonly IReadOnlyList<PolicyRule> _rules = /* 从 Resource + RoleResource 组装 */;
public ValueTask<IReadOnlyList<PolicyRule>> GetAllAsync(CancellationToken ct = default) => new(_rules);
public ValueTask<long> GetVersionAsync(CancellationToken ct = default)
=> new(/* RoleResource/Resource 表 MAX(UpdatedAt).Ticks,无数据为 0 */);
// GetPolicyByIdAsync / ReloadAsync / GetRulesForPrincipalAsync 依契约实现
}
组装(在 AddAuthorizationEngine 之后「引入包即替换」):
services.AddAuthorizationEngine();
services.RemoveAll<IAuthorizationPolicyRepository>();
services.AddSingleton<IAuthorizationPolicyRepository, BopAbacPolicyStore>();
方法标注 [Authorize(Policy = "user:list")](Perms 即策略名),动态策略提供者自动构造需求,AuthorizationEngineHandler 经业务桥组装规则评估,无需预注册、无需 Handler。
角色→主体:引擎把主体属性
Roles展开为role:{r};业务模板通过IAuthorizationAttributeResolver(PIP)把当前用户角色集合(如IDataPermissionContext.RoleIds)桥接进request.Subject.Set("Roles", roleIds)。
Agent 主体验证(与 RBAC 并列)
Agent 作为一等公民:Principals 可含 agent:{agentId},GetRulesForPrincipalAsync 按 {type}:{id} 统一匹配。显式四要素请求用 Subject(id, type: "agent") 直接以 agent:{id} 主体评估;双重主体(Agent 代用户执行)——Agent 身份经 Principals 判定,所代用户落在 user 域属性(框架仅内置 user/resource/env 属性域,无 agent 域):
// 显式 Agent 主体
var decision = await _authorizationService.AuthorizeAsync(
new Subject("data-analyzer", "agent"), report, "report:view", null);
// 双重主体:Agent(agent:data-analyzer) 只能代 principalUserId == 当前 user.userId 的用户操作
var policy = new PolicyRule
{
Id = "report:view", Effect = PolicyEffect.Allow,
Principals = ["agent:data-analyzer"], Actions = ["report:view"], Category = "rbac",
Conditions =
[
new ConditionBlock { Operator = ConditionOperator.StringEquals,
Key = "user.principalUserId", Values = ["${user.userId}"] },
],
};
// 请求侧:Agent 主体注入 principalUserId 与 userId 两个 subject 属性
var subject = new Subject("data-analyzer", "agent")
.Set("principalUserId", "u-42")
.Set("userId", "u-42");
HttpContext 环境属性源(自动装配)
services.AddAuthorizationEngine(); // env.SourceIp / env.UserAgent 自动回退 HttpContext,无需显式装配
引擎直用(低层 API,零 Web)
var engine = sp.GetRequiredService<IAuthorizationEngine>();
var decision = await engine.EvaluateAsync(new AuthorizationRequest
{
Subject = new Subject("alice"),
Resource = new Resource("acs:doc:*:*:report/123"),
Action = new Action("doc:Read"),
});
if (decision.IsAllowed) { /* 执行 */ }
依赖
Galosys.Foundation.Authorization(核心 PDP,零 Http 引用)Galosys.Foundation.CoreMicrosoft.AspNetCore.Authorization(官方授权抽象)Microsoft.AspNetCore.Http(PEP 适配层必须引用IHttpContextAccessor/HttpContextAccessor;已移除Microsoft.AspNetCore.Http.Abstractions直接引用)Microsoft.Extensions.DependencyInjection/Microsoft.Extensions.Logging
不依赖 Galosys.Foundation.AspNetCore 模块与 Galosys.Foundation.DataPermission(数据权限 / Casbin 为独立集成包的显式装配)。
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Galosys.Foundation.Authorization (>= 26.9.23.1)
- Galosys.Foundation.Core (>= 26.9.23.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 26.9.23.1 | 43 | 9/23/2026 |
| 26.9.16.1 | 83 | 9/16/2026 |
| 26.9.15.1 | 82 | 9/15/2026 |
| 26.9.14.1 | 77 | 9/14/2026 |
| 26.9.10.1 | 94 | 9/10/2026 |
| 26.9.3.1 | 88 | 9/3/2026 |
| 26.8.29.1 | 95 | 8/31/2026 |
| 26.8.26.1 | 105 | 8/26/2026 |
| 26.8.23.1 | 102 | 8/23/2026 |
| 26.8.21.1 | 96 | 8/21/2026 |
| 26.8.20.1 | 96 | 8/20/2026 |
| 26.8.18.1 | 108 | 8/18/2026 |
| 26.8.17.1 | 105 | 8/17/2026 |
| 26.8.13.2 | 104 | 8/13/2026 |
| 26.8.13.1 | 104 | 8/13/2026 |
| 26.8.12.2 | 101 | 8/12/2026 |
| 26.8.12.1 | 103 | 8/12/2026 |
| 26.8.10.1 | 110 | 8/10/2026 |
| 26.8.5.1 | 101 | 8/5/2026 |
| 26.8.4.1 | 99 | 8/4/2026 |