Description
ABAC requires a populated ISecurityContextAccessor, but AddEncinaABAC neither registers it with the DI container nor does Encina provide a mechanism to populate SecurityContext from HttpContext.User. Applications following the quick-start receive abac.missing_context on every request after PR #1701 merges.
Steps to Reproduce
- Configure ABAC using only
AddEncinaABAC (per docs/features/abac/quick-start.md:21-41)
- Create an endpoint decorated with
[RequirePolicy] or [RequireCondition]
- Make an authenticated request to that endpoint
- See
abac.missing_context error
Expected Behavior
The ABAC PEP evaluates against a security context the framework provides, opt-in and fail-closed:
AddEncinaABAC registers everything it resolves, or fails at startup with a message naming the missing registration (AddEncinaSecurity); a DI test builds ABAC alone with ValidateOnBuild and ValidateScopes (AGENTS.md section 3).
- An opt-in ASP.NET Core integration in Encina.AspNetCore populates
SecurityContext from HttpContext.User per request (user id from the configured claim, roles, IsAuthenticated), registered by an explicit extension method; tests with an authenticated and an anonymous request.
- A documented service-identity pattern for background jobs and message handlers (an explicit scope that sets a service principal).
- The ABAC quick-start and README show the complete registration.
Actual Behavior
After PR #1701 merges, every request decorated with [RequirePolicy] or [RequireCondition] fails with abac.missing_context. Before #1701, the behavior was fail-open: the request was evaluated as user "" (#1676).
Environment
Code Sample
// docs/features/abac/quick-start.md:21-41 registers only ABAC:
services.AddEncinaABAC(options => { /* ... */ });
// No AddEncinaSecurity() and nothing sets ISecurityContextAccessor.SecurityContext,
// so [RequirePolicy] requests are denied with abac.missing_context.
Stack Trace
Not applicable: the request returns Left(abac.missing_context); no exception is thrown.
Additional Context
Root Cause
AddEncinaABAC resolves ISecurityContextAccessor in pipeline behavior but never registers it with the DI container. Unit tests manually add a substitute; no test validates ABAC registration alone with ValidateOnBuild/ValidateScopes.
- Nothing in
src/ sets ISecurityContextAccessor.SecurityContext. The only reference is a hand-copied snippet in src/Encina.Security/README.md:58-65. Encina.AspNetCore does not provide an integration to populate the context from HttpContext.User.
- No documented pattern exists for populating the security context in non-HTTP flows (background jobs, message handlers).
Related
Description
ABAC requires a populated
ISecurityContextAccessor, butAddEncinaABACneither registers it with the DI container nor does Encina provide a mechanism to populateSecurityContextfromHttpContext.User. Applications following the quick-start receiveabac.missing_contexton every request after PR #1701 merges.Steps to Reproduce
AddEncinaABAC(perdocs/features/abac/quick-start.md:21-41)[RequirePolicy]or[RequireCondition]abac.missing_contexterrorExpected Behavior
The ABAC PEP evaluates against a security context the framework provides, opt-in and fail-closed:
AddEncinaABACregisters everything it resolves, or fails at startup with a message naming the missing registration (AddEncinaSecurity); a DI test builds ABAC alone withValidateOnBuildandValidateScopes(AGENTS.md section 3).SecurityContextfromHttpContext.Userper request (user id from the configured claim, roles,IsAuthenticated), registered by an explicit extension method; tests with an authenticated and an anonymous request.Actual Behavior
After PR #1701 merges, every request decorated with
[RequirePolicy]or[RequireCondition]fails withabac.missing_context. Before #1701, the behavior was fail-open: the request was evaluated as user "" (#1676).Environment
Code Sample
Stack Trace
Additional Context
Root Cause
AddEncinaABACresolvesISecurityContextAccessorin pipeline behavior but never registers it with the DI container. Unit tests manually add a substitute; no test validates ABAC registration alone withValidateOnBuild/ValidateScopes.src/setsISecurityContextAccessor.SecurityContext. The only reference is a hand-copied snippet insrc/Encina.Security/README.md:58-65.Encina.AspNetCoredoes not provide an integration to populate the context fromHttpContext.User.Related