Rig.TUnit.Security.Policies
0.1.0-beta.2
dotnet add package Rig.TUnit.Security.Policies --version 0.1.0-beta.2
NuGet\Install-Package Rig.TUnit.Security.Policies -Version 0.1.0-beta.2
<PackageReference Include="Rig.TUnit.Security.Policies" Version="0.1.0-beta.2" />
<PackageVersion Include="Rig.TUnit.Security.Policies" Version="0.1.0-beta.2" />
<PackageReference Include="Rig.TUnit.Security.Policies" />
paket add Rig.TUnit.Security.Policies --version 0.1.0-beta.2
#r "nuget: Rig.TUnit.Security.Policies, 0.1.0-beta.2"
#:package Rig.TUnit.Security.Policies@0.1.0-beta.2
#addin nuget:?package=Rig.TUnit.Security.Policies&version=0.1.0-beta.2&prerelease
#tool nuget:?package=Rig.TUnit.Security.Policies&version=0.1.0-beta.2&prerelease
Rig.TUnit.Security.Policies
Policy-based authorisation testing — real
IAuthorizationServicein-process so productionAuthorizationHandler<T>runs unchanged.
What this package is
Runs your ASP.NET Core AuthorizationHandler<TRequirement>
implementations inside a real IAuthorizationService — no test bypass,
no [AllowAnonymous] shortcut. PolicyFixture constructs the DI
container with policies you declare, and PolicyAssert.Policy(…).Allows (principal) / .Denies(principal) executes the full pipeline and
asserts the decision.
When to use it
- Unit-testing policy definitions — does "AdminOnly" actually require the role you think it does?
- Verifying custom
AuthorizationHandler<T>behaviour end-to-end. - Regression-testing policy changes after a claims-transformation refactor.
- Not for: full HTTP integration — layer with
Rig.TUnit.WebAPIand send real requests.
Prerequisites
- .NET 10 SDK
- Project under test uses ASP.NET Core authorisation (package reference:
Microsoft.AspNetCore.Authorization).
Quick start
using System.Security.Claims;
using Rig.TUnit.Security.Policies.Fixtures;
await using var fx = new PolicyFixture(
new PolicyFixtureOptions(),
policies => policies.AddPolicy("AdminOnly", p => p.RequireRole("admin")));
await fx.InitializeAsync();
Options
| Property | Type | Default | Description |
|---|---|---|---|
DefaultScheme |
string |
"Test" |
Scheme name surfaced on the fixture's ConnectionString |
RequiredClaims |
string[] |
[] |
Claims auto-asserted on every principal |
LogDecisions |
bool |
false |
Emit structured log per allow/deny |
Fixture + helper APIs
Rig.TUnit.Security.Policies.Fixtures.PolicyFixtureRig.TUnit.Security.Policies.Options.PolicyFixtureOptionsRig.TUnit.Security.Policies.Builder.PoliciesRigBuilderRig.TUnit.Security.Policies.Assertions.PolicyAssert
Per-test isolation
PolicyFixture owns its DI container per-test; policies registered in
one fixture do not leak into another. Safe under full parallelism.
Parallelism + performance
- Fixture construction: ~5 ms (DI container + policy registry).
- Per-assertion: ~100 µs (
IAuthorizationService.AuthorizeAsync). - Safe under full parallelism.
Troubleshooting
AuthorizationResult.Failedon an expected-allow — confirm theClaimsPrincipalhas a non-nullIsAuthenticatedidentity; anonymous principals fail most policies.- Handler never invoked — ensure
RequireAssertionorRequireRoleis on the policy; a policy without any requirement succeeds by default.
See docs/troubleshooting.md#policies.
Provider quirks + edge cases
AuthorizationOptions.DefaultPolicyis respected — tests without an explicit policy fall through to it.- Multiple
AuthorizationHandler<T>for the same requirement all run; anycontext.Succeed(…)grants — tests asserting "no handler ran" must track this carefully.
Benchmarks
See PolicyBenchmarks.cs;
baseline in benchmarks/baseline-005.json.
Related docs
- Architecture diagram
- Glossary
- Family base:
Rig.TUnit.Security
License
MIT. See LICENSE.
| 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
- Bogus (>= 35.6.1)
- Rig.TUnit.Security (>= 0.1.0-beta.2)
- TUnit.Core (>= 1.34.5)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Rig.TUnit.Security.Policies:
| Package | Downloads |
|---|---|
|
Rig.TUnit.All
Meta-package containing every Rig.TUnit.* package. DISCOURAGED — prefer per-feature or per-stack meta-packages (Rig.TUnit, Rig.TUnit.Microservices). |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-beta.2 | 62 | 4/27/2026 |
| 0.0.0-alpha.0.14 | 69 | 4/26/2026 |