diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/NotAuthorized.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/NotAuthorized.razor
similarity index 100%
rename from samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/NotAuthorized.razor
rename to samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/NotAuthorized.razor
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/NotAuthorized.razor.cs b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/NotAuthorized.razor.cs
similarity index 82%
rename from samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/NotAuthorized.razor.cs
rename to samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/NotAuthorized.razor.cs
index eb018194..6142f36a 100644
--- a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/NotAuthorized.razor.cs
+++ b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/NotAuthorized.razor.cs
@@ -1,4 +1,4 @@
-namespace CodeBeam.UltimateAuth.Sample.Shared.Components.Page;
+namespace CodeBeam.UltimateAuth.Sample.Shared.Components.Custom;
public partial class NotAuthorized
{
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleAuthorizationResult.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleAuthorizationResult.razor
new file mode 100644
index 00000000..11d5faf7
--- /dev/null
+++ b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleAuthorizationResult.razor
@@ -0,0 +1,66 @@
+@inject NavigationManager Nav
+
+
+
+
+
+
+
+
+
+ @(Public ? "Public Access" : "Access Granted")
+ @Description
+
+
+
+
+
+ Scenario
+ @Title
+
+
+
+ Authorization
+ @(Public ? "Public" : "Authorized")
+
+
+
+
+
+
+
+
+
+
+ REQUIREMENT
+
+
+
+
+ @Requirement
+
+
+
+
+
+
+ Back to Home
+
+
+
+
+
+
+@code {
+ [Parameter, EditorRequired]
+ public string Title { get; set; } = default!;
+
+ [Parameter]
+ public string Description { get; set; } = "You have successfully accessed this protected page.";
+
+ [Parameter]
+ public bool Public { get; set; }
+
+ [Parameter, EditorRequired]
+ public string Requirement { get; set; } = default!;
+}
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleMatchModes.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleMatchModes.razor
new file mode 100644
index 00000000..c1198861
--- /dev/null
+++ b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleMatchModes.razor
@@ -0,0 +1,192 @@
+@using CodeBeam.UltimateAuth.Core.Contracts
+@using CodeBeam.UltimateAuth.Core.Defaults
+
+
+
+
+
+
+
+
+
+
+
+ Authorization Match Modes
+
+
+
+ Compare how Category, Any, and All evaluate the same requirements.
+
+
+
+
+
+
+ Requirements
+
+
+
+ Roles: Admin, Manager, User
+
+
+
+ Permission: @UAuthActions.Users.QueryAdmin
+
+
+
+
+
+
+
+
+
+
+
+ Category
+
+
+
+ One matching role AND the permission.
+
+
+
+
+
+
+
+
+ Authorized
+
+
+
+
+
+ Denied
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Any
+
+
+
+ One matching role OR the permission.
+
+
+
+
+
+
+
+
+ Authorized
+
+
+
+
+
+ Denied
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ All
+
+
+
+ Both roles AND the permission.
+
+
+
+
+
+
+
+
+ Authorized
+
+
+
+
+
+ Denied
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to Home
+
+
+
+
+
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleStateView.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleStateView.razor
new file mode 100644
index 00000000..1a3618c9
--- /dev/null
+++ b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Custom/SampleStateView.razor
@@ -0,0 +1,130 @@
+@using CodeBeam.UltimateAuth.Core.Defaults
+
+
+
+
+
+
+
+
+
+
+
+
+ UAuthStateView
+
+
+
+ This page is public. Each section evaluates its own authorization requirements.
+
+
+
+
+
+
+
+
+ Authenticated User
+
+
+
+ No role or permission required.
+
+
+
+
+
+
+ Welcome, @state.Identity?.DisplayName!
+
+
+
+
+
+ Authentication required.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Admin Role
+
+
+
+ Roles = Admin
+
+
+
+
+
+
+ Admin role granted.
+
+
+
+
+
+ Admin role required.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Admin Permission
+
+
+
+ @UAuthActions.Users.QueryAdmin
+
+
+
+
+
+
+ Admin permission granted.
+
+
+
+
+
+ Admin permission required.
+
+
+
+
+
+
+
+
+
+ Back to Home
+
+
+
+
+
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Layout/SampleMainLayout.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Layout/SampleMainLayout.razor
index 4d367b16..569f765f 100644
--- a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Layout/SampleMainLayout.razor
+++ b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Layout/SampleMainLayout.razor
@@ -11,6 +11,50 @@
+
+
+
+
+ Authorization Lab
+
+
+
+
+
+
+
+ Authorization Lab
+
+
+
+ Explore route and UI authorization.
+
+
+
+
+ ROUTE PROTECTION
+
+
+
+
+
+
+
+
+ AUTHORIZATION MODELS
+
+
+
+
+
+
+
+ COMPONENT AUTHORIZATION
+
+
+
+
+
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/SampleAuthorizedTestPage.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/SampleAuthorizedTestPage.razor
deleted file mode 100644
index 20d3062f..00000000
--- a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/Page/SampleAuthorizedTestPage.razor
+++ /dev/null
@@ -1,30 +0,0 @@
-@using CodeBeam.UltimateAuth.Core.Defaults
-@inherits UAuthPageBase
-
-
-
-
-
-
- Everything is Ok
-
-
- If you see this section, it means you succesfully logged in.
-
-
-
- Go Home Page
-
-
-
-
-
- This is admin view content.
-
-
-
- UltimateAuth protects this resource based on your session and permissions.
-
-
-
-
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/SampleRoutes.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/SampleRoutes.razor
index 278fb57d..9903d442 100644
--- a/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/SampleRoutes.razor
+++ b/samples/CodeBeam.UltimateAuth.Sample.Shared/Components/SampleRoutes.razor
@@ -1,5 +1,4 @@
@using System.Reflection
-@using CodeBeam.UltimateAuth.Sample.Shared.Components.Page
@using CodeBeam.UltimateAuth.Sample.Shared.Infrastructure
@implements IDisposable
@@ -36,7 +35,9 @@
*@
-
+
+
+
diff --git a/samples/CodeBeam.UltimateAuth.Sample.Shared/_Imports.razor b/samples/CodeBeam.UltimateAuth.Sample.Shared/_Imports.razor
index 7309978c..fecf3334 100644
--- a/samples/CodeBeam.UltimateAuth.Sample.Shared/_Imports.razor
+++ b/samples/CodeBeam.UltimateAuth.Sample.Shared/_Imports.razor
@@ -6,6 +6,10 @@
@using CodeBeam.UltimateAuth.Client.Runtime
@using CodeBeam.UltimateAuth.Client.Diagnostics
@using CodeBeam.UltimateAuth.Client.Blazor
+@using CodeBeam.UltimateAuth.Core.Contracts
+@using CodeBeam.UltimateAuth.Core.Defaults
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+@using Microsoft.AspNetCore.Authorization
@using MudBlazor
@using MudExtensions
diff --git a/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-shm b/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-shm
index 87c20d78..5eaf9289 100644
Binary files a/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-shm and b/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-shm differ
diff --git a/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-wal b/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-wal
index 3a16e535..97609168 100644
Binary files a/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-wal and b/samples/UAuthHub/CodeBeam.UltimateAuth.Sample.UAuthHub.EFCore/uauthhub.db-wal differ
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AnonymousTestPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AnonymousTestPage.razor
deleted file mode 100644
index 10d035ba..00000000
--- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AnonymousTestPage.razor
+++ /dev/null
@@ -1 +0,0 @@
-@page "/anonymous-test"
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AdminPermissionPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AdminPermissionPage.razor
new file mode 100644
index 00000000..3fcd123c
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AdminPermissionPage.razor
@@ -0,0 +1,6 @@
+@page "/samples/auth/permission-admin"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AdminRolePage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AdminRolePage.razor
new file mode 100644
index 00000000..181a1ea9
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AdminRolePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/admin"
+@attribute [UAuthAuthorize(Roles = "Admin")]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AspNetAuthorizePage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AspNetAuthorizePage.razor
new file mode 100644
index 00000000..5b1211d8
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AspNetAuthorizePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/aspnet"
+@attribute [Authorize]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AuthenticatedPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AuthenticatedPage.razor
new file mode 100644
index 00000000..9d621509
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/AuthenticatedPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/authenticated"
+@attribute [UAuthAuthorize]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/CombinedAuthorizationPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
new file mode 100644
index 00000000..d27b0add
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
@@ -0,0 +1,8 @@
+@page "/samples/auth/combined"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+@attribute [Authorize(Roles = "Admin")]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/MatchModesPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/MatchModesPage.razor
new file mode 100644
index 00000000..8fc527ac
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/MatchModesPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/match-modes"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/PublicPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/PublicPage.razor
new file mode 100644
index 00000000..32cee135
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/PublicPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/public"
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/StateViewPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/StateViewPage.razor
new file mode 100644
index 00000000..f07ce7a1
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizationLab/StateViewPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/state-view"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizedTestPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizedTestPage.razor
deleted file mode 100644
index 0a953043..00000000
--- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/Pages/AuthorizedTestPage.razor
+++ /dev/null
@@ -1,4 +0,0 @@
-@page "/authorized-test"
-@attribute [UAuthAuthorize]
-
-
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/_Imports.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/_Imports.razor
index 22b7f9e4..6d46e295 100644
--- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/_Imports.razor
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer.EFCore/Components/_Imports.razor
@@ -22,6 +22,7 @@
@using CodeBeam.UltimateAuth.Sample.Shared.Components
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Page
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Layout
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
@using MudBlazor
@using MudExtensions
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AnonymousTestPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AnonymousTestPage.razor
deleted file mode 100644
index 10d035ba..00000000
--- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AnonymousTestPage.razor
+++ /dev/null
@@ -1 +0,0 @@
-@page "/anonymous-test"
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AdminPermissionPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AdminPermissionPage.razor
new file mode 100644
index 00000000..3fcd123c
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AdminPermissionPage.razor
@@ -0,0 +1,6 @@
+@page "/samples/auth/permission-admin"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AdminRolePage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AdminRolePage.razor
new file mode 100644
index 00000000..181a1ea9
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AdminRolePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/admin"
+@attribute [UAuthAuthorize(Roles = "Admin")]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AspNetAuthorizePage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AspNetAuthorizePage.razor
new file mode 100644
index 00000000..5b1211d8
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AspNetAuthorizePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/aspnet"
+@attribute [Authorize]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AuthenticatedPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AuthenticatedPage.razor
new file mode 100644
index 00000000..9d621509
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/AuthenticatedPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/authenticated"
+@attribute [UAuthAuthorize]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/CombinedAuthorizationPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
new file mode 100644
index 00000000..d27b0add
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
@@ -0,0 +1,8 @@
+@page "/samples/auth/combined"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+@attribute [Authorize(Roles = "Admin")]
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/MatchModesPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/MatchModesPage.razor
new file mode 100644
index 00000000..8fc527ac
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/MatchModesPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/match-modes"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/PublicPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/PublicPage.razor
new file mode 100644
index 00000000..32cee135
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/PublicPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/public"
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/StateViewPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/StateViewPage.razor
new file mode 100644
index 00000000..f07ce7a1
--- /dev/null
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizationLab/StateViewPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/state-view"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizedTestPage.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizedTestPage.razor
deleted file mode 100644
index 0a953043..00000000
--- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizedTestPage.razor
+++ /dev/null
@@ -1,4 +0,0 @@
-@page "/authorized-test"
-@attribute [UAuthAuthorize]
-
-
diff --git a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/_Imports.razor b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/_Imports.razor
index 8f58fb15..bb74ad71 100644
--- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/_Imports.razor
+++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/_Imports.razor
@@ -21,6 +21,7 @@
@using CodeBeam.UltimateAuth.Sample.Shared.Components
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Page
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Layout
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
@using MudBlazor
@using MudExtensions
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AnonymousTestPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AnonymousTestPage.razor
deleted file mode 100644
index 10d035ba..00000000
--- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AnonymousTestPage.razor
+++ /dev/null
@@ -1 +0,0 @@
-@page "/anonymous-test"
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AdminPermissionPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AdminPermissionPage.razor
new file mode 100644
index 00000000..3fcd123c
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AdminPermissionPage.razor
@@ -0,0 +1,6 @@
+@page "/samples/auth/permission-admin"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AdminRolePage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AdminRolePage.razor
new file mode 100644
index 00000000..181a1ea9
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AdminRolePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/admin"
+@attribute [UAuthAuthorize(Roles = "Admin")]
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AspNetAuthorizePage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AspNetAuthorizePage.razor
new file mode 100644
index 00000000..5b1211d8
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AspNetAuthorizePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/aspnet"
+@attribute [Authorize]
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AuthenticatedPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AuthenticatedPage.razor
new file mode 100644
index 00000000..9d621509
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/AuthenticatedPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/authenticated"
+@attribute [UAuthAuthorize]
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/CombinedAuthorizationPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
new file mode 100644
index 00000000..d27b0add
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
@@ -0,0 +1,8 @@
+@page "/samples/auth/combined"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+@attribute [Authorize(Roles = "Admin")]
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/MatchModesPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/MatchModesPage.razor
new file mode 100644
index 00000000..8fc527ac
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/MatchModesPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/match-modes"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/PublicPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/PublicPage.razor
new file mode 100644
index 00000000..32cee135
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/PublicPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/public"
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/StateViewPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/StateViewPage.razor
new file mode 100644
index 00000000..f07ce7a1
--- /dev/null
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizationLab/StateViewPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/state-view"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizedTestPage.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizedTestPage.razor
deleted file mode 100644
index 0a953043..00000000
--- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizedTestPage.razor
+++ /dev/null
@@ -1,4 +0,0 @@
-@page "/authorized-test"
-@attribute [UAuthAuthorize]
-
-
diff --git a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/_Imports.razor b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/_Imports.razor
index 3826aa6f..32c621c0 100644
--- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/_Imports.razor
+++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/_Imports.razor
@@ -21,6 +21,7 @@
@using CodeBeam.UltimateAuth.Sample.Shared.Components
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Page
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Layout
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
@using MudBlazor
@using MudExtensions
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AnonymousTestPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AnonymousTestPage.razor
deleted file mode 100644
index 10d035ba..00000000
--- a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AnonymousTestPage.razor
+++ /dev/null
@@ -1 +0,0 @@
-@page "/anonymous-test"
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AdminPermissionPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AdminPermissionPage.razor
new file mode 100644
index 00000000..3fcd123c
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AdminPermissionPage.razor
@@ -0,0 +1,6 @@
+@page "/samples/auth/permission-admin"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AdminRolePage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AdminRolePage.razor
new file mode 100644
index 00000000..181a1ea9
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AdminRolePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/admin"
+@attribute [UAuthAuthorize(Roles = "Admin")]
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AspNetAuthorizePage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AspNetAuthorizePage.razor
new file mode 100644
index 00000000..5b1211d8
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AspNetAuthorizePage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/aspnet"
+@attribute [Authorize]
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AuthenticatedPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AuthenticatedPage.razor
new file mode 100644
index 00000000..9d621509
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/AuthenticatedPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/authenticated"
+@attribute [UAuthAuthorize]
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/CombinedAuthorizationPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
new file mode 100644
index 00000000..d27b0add
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/CombinedAuthorizationPage.razor
@@ -0,0 +1,8 @@
+@page "/samples/auth/combined"
+@using CodeBeam.UltimateAuth.Core.Defaults
+@attribute [UAuthAuthorize(Permissions = UAuthActions.Users.QueryAdmin)]
+@attribute [Authorize(Roles = "Admin")]
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/MatchModesPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/MatchModesPage.razor
new file mode 100644
index 00000000..8fc527ac
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/MatchModesPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/match-modes"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/PublicPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/PublicPage.razor
new file mode 100644
index 00000000..32cee135
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/PublicPage.razor
@@ -0,0 +1,5 @@
+@page "/samples/auth/public"
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/StateViewPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/StateViewPage.razor
new file mode 100644
index 00000000..f07ce7a1
--- /dev/null
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizationLab/StateViewPage.razor
@@ -0,0 +1,4 @@
+@page "/samples/auth/state-view"
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
+
+
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizedTestPage.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizedTestPage.razor
deleted file mode 100644
index 0a953043..00000000
--- a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/Pages/AuthorizedTestPage.razor
+++ /dev/null
@@ -1,4 +0,0 @@
-@page "/authorized-test"
-@attribute [UAuthAuthorize]
-
-
diff --git a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/_Imports.razor b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/_Imports.razor
index 819b9c9e..f40d9af6 100644
--- a/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/_Imports.razor
+++ b/samples/int-wasm/CodeBeam.UAuth.Sample.IntWasm/CodeBeam.UAuth.Sample.IntWasm.Client/_Imports.razor
@@ -18,6 +18,7 @@
@using CodeBeam.UltimateAuth.Sample.Shared.Components
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Page
@using CodeBeam.UltimateAuth.Sample.Shared.Components.Layout
+@using CodeBeam.UltimateAuth.Sample.Shared.Components.Custom
@using MudBlazor
@using MudExtensions