Permission Middleware
Trên trang này
Không gian tên: Nalix.Runtime.Middleware.Standard
Assembly: Nalix.Runtime
PermissionMiddleware ([MiddlewareOrder(-50)] [MiddlewareStage(MiddlewareStage.Inbound)] public class PermissionMiddleware : IPacketMiddleware<IPacket>) là chốt cấp quyền theo kiểu fail-closed tích hợp sẵn trong Nalix.Runtime. Nó chạy ở thứ tự -50, trước middleware giới hạn tốc độ và middleware thời gian chờ.
Ánh xạ mã nguồn
src/Nalix.Runtime/Middleware/Standard/PermissionMiddleware.cssrc/Nalix.Abstractions/Networking/Packets/PacketPermissionAttribute.cssrc/Nalix.Abstractions/Security/PermissionLevel.cssrc/Nalix.Runtime/Internal/RateLimiting/DirectiveGuard.cssrc/Nalix.Codec/ProtocolFrames/Directive.cs
Quy tắc cấp quyền (IsAuthorized)
PermissionMiddleware áp dụng tư thế bảo mật fail-closed (SEC-37):
- Nếu
context.Attributes.Permissionlànull(method handler thiếu[PacketPermission]), yêu cầu bị từ chối. - Ngược lại, nó đánh giá
context.Attributes.Permission.Evaluation:PermissionEvaluation.MinimumLevel(mặc định): Được phép khicontext.Connection.Level >= policy.Level.PermissionEvaluation.StrictMatch: Được phép khicontext.Connection.Level == policy.Level.
Luồng thực thi
flowchart TD
A["InvokeAsync(context, next)"] --> B{"context.Attributes.Permission is not null && IsAuthorized(...)?"}
B -->|Yes| C["Forward to next(context.CancellationToken) (Zero-Alloc Sync Fast Path)"]
B -->|No| D["context.Connection.IncrementErrorCount()"]
D --> E{"DirectiveGuard.TryAcquire(InboundDirectiveUnauthorizedLastSentAtMs)?"}
E -->|No (Suppressed)| F["Return without sending duplicate Directive"]
E -->|Yes| G["Rent Directive via PacketFactory<Directive>.Acquire()"]
G --> H["Initialize(FAIL, UNAUTHORIZED, NONE, seqId, NONE, 0, 0, arg2: OpCode)"]
H --> I["await context.Sender.SendAsync(directive)"]Định dạng directive từ chối
Khi gói tin bị từ chối và DirectiveGuard cho phép gửi (dựa trên RuntimeConnectionState.InboundDirectiveUnauthorizedLastSentAtMs và DirectiveGuardOptions.DefaultCooldownMs), PermissionMiddleware lấy từ pool một Directive (0x0008, 21 byte) với:
| Trường | Giá trị |
|---|---|
Type | ControlType.FAIL |
Reason | ProtocolReason.UNAUTHORIZED |
Action | ProtocolAdvice.NONE |
SequenceId | context.Packet.Header.SequenceId |
Control | ControlFlags.NONE |
Arg0 / Arg1 | 0 |
Arg2 | context.Packet.Header.OpCode |
Ví dụ sử dụng
using Nalix.Abstractions.Networking.Packets;
using Nalix.Abstractions.Security;
using Nalix.Runtime.Middleware.Standard;
// 1. Đăng ký PermissionMiddleware trong PacketDispatchOptions
builder.ConfigureDispatch(options =>
{
options.WithMiddleware(new PermissionMiddleware());
});
// 2. Gắn [PacketPermission] cho các handler
[PacketHandler]
public sealed class AdminController
{
[PacketOpcode(0x3001)]
[PacketEncryption(true)]
[PacketPermission(PermissionLevel.SYSTEM_ADMINISTRATOR, PermissionEvaluation.MinimumLevel)]
public void ReloadConfig(IPacketContext<AdminReloadPacket> context)
{
// Chỉ các kết nối có Level >= SYSTEM_ADMINISTRATOR mới đến được đây
}
}