From 3aea6e008b7dc385736a6a766c7cdf15764deb82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Can=20Karag=C3=B6z?= Date: Mon, 20 Apr 2026 14:00:23 +0300 Subject: [PATCH 1/2] Added UAuthAuthorize Attribute --- .../uauthhub.db-shm | Bin 32768 -> 32768 bytes .../uauthhub.db-wal | Bin 716912 -> 898192 bytes .../Components/Pages/AuthorizedTestPage.razor | 3 +- .../Components/Pages/AuthorizedTestPage.razor | 5 +- .../Pages/AuthorizedTestPage.razor | 3 +- .../Pages/AuthorizedTestPage.razor | 5 +- .../Attributes/UAuthAuthorizeAttribute.cs | 8 +++ .../Components/Base/UAuthFlowPageBase.cs | 2 - .../Base/UAuthReactiveComponentBase.cs | 63 ++++++++++++++++++ 9 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 src/client/CodeBeam.UltimateAuth.Client.Blazor/Attributes/UAuthAuthorizeAttribute.cs 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 3b286565f3252c116e01ea39ae905a848e128bdb..64e200c5e95af84cc367412a0e1d6236f4b6f4fd 100644 GIT binary patch delta 595 zcmb7=+bcv-6vo#&yHVzayihI;(oo}4E~OO1NQnoxQA#N(JP65@Vut@fyZi%_=H(P) zn{mI4`(-dQ7|e^3yn83s+1rCRS@m^(>s#MmwT{Q5c|4jsRX?`h9n#uN)FhE|NET8qDUXy-`fFyU zObRKLWZaNN%I0HOZb~LH^J=sT2ivS+WpF3#%!>TZuH&_stuI2nS5C~K;|;g7Y5viu zV_cdd(iBI0P<-7?{HQqGYD3c!1Yw6>cv&SpNuOCDM23$~w9T<)SR-C!Rgh4_TsSa> zV!YF-;i1IQZl}iluxGypD-08F% delta 438 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 N?26Z~e}QD_{{f+w$qWDh delta 8816 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 e502=Xbf 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 index 5dc5d8aa..d0a06c06 100644 --- a/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizedTestPage.razor +++ b/samples/blazor-server/CodeBeam.UltimateAuth.Sample.BlazorServer/Components/Pages/AuthorizedTestPage.razor @@ -1,5 +1,6 @@ @page "/authorized-test" -@attribute [Authorize] +@attribute [UAuthAuthorize] +@inherits UAuthFlowPageBase @@ -13,7 +14,7 @@ - Go Profile + Go Home Page 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 index e5554c4e..2dd294b2 100644 --- a/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizedTestPage.razor +++ b/samples/blazor-standalone-wasm/CodeBeam.UltimateAuth.Sample.BlazorStandaloneWasm/Pages/AuthorizedTestPage.razor @@ -1,5 +1,6 @@ @page "/authorized-test" -@attribute [Authorize] +@attribute [UAuthAuthorize] +@inherits UAuthFlowPageBase 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 index e5554c4e..9d78b597 100644 --- 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 @@ -1,5 +1,6 @@ @page "/authorized-test" -@attribute [Authorize] +@attribute [UAuthAuthorize] +@inherits UAuthFlowPageBase @@ -13,7 +14,7 @@ - Go Profile + Go Home Page diff --git a/src/client/CodeBeam.UltimateAuth.Client.Blazor/Attributes/UAuthAuthorizeAttribute.cs b/src/client/CodeBeam.UltimateAuth.Client.Blazor/Attributes/UAuthAuthorizeAttribute.cs new file mode 100644 index 00000000..971364ac --- /dev/null +++ b/src/client/CodeBeam.UltimateAuth.Client.Blazor/Attributes/UAuthAuthorizeAttribute.cs @@ -0,0 +1,8 @@ +namespace CodeBeam.UltimateAuth.Client.Blazor; + +[AttributeUsage(AttributeTargets.Class)] +public sealed class UAuthAuthorizeAttribute : Attribute +{ + public string? Roles { get; set; } + public string? Permissions { get; set; } +} diff --git a/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthFlowPageBase.cs b/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthFlowPageBase.cs index 8f805211..8a73748d 100644 --- a/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthFlowPageBase.cs +++ b/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthFlowPageBase.cs @@ -8,8 +8,6 @@ namespace CodeBeam.UltimateAuth.Client.Blazor; public abstract class UAuthFlowPageBase : UAuthReactiveComponentBase { - [Inject] protected NavigationManager Nav { get; set; } = default!; - protected AuthFlowPayload? UAuthPayload { get; private set; } protected string? ReturnUrl { get; private set; } protected bool ShouldFocus { get; private set; } diff --git a/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthReactiveComponentBase.cs b/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthReactiveComponentBase.cs index fb67afe8..38d8ade6 100644 --- a/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthReactiveComponentBase.cs +++ b/src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/Base/UAuthReactiveComponentBase.cs @@ -5,10 +5,13 @@ namespace CodeBeam.UltimateAuth.Client.Blazor; public abstract class UAuthReactiveComponentBase : ComponentBase, IDisposable { private UAuthState? _previousState; + private bool _rendered; [CascadingParameter] protected UAuthState AuthState { get; set; } = default!; + [Inject] protected NavigationManager Nav { get; set; } = default!; + /// /// Automatically re-render when UAuthState changes. /// Can be overridden to disable. @@ -31,12 +34,24 @@ protected override void OnParametersSet() AuthState.Changed += OnAuthStateChanged; _previousState = AuthState; } + + EvaluateAuthorization(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + await base.OnAfterRenderAsync(firstRender); + + if (firstRender) + _rendered = true; } private void OnAuthStateChanged(UAuthStateChangeReason reason) { HandleAuthStateChanged(reason); + EvaluateAuthorization(); + if (AutoRefreshOnAuthStateChanged) _ = InvokeAsync(StateHasChanged); } @@ -48,6 +63,54 @@ protected virtual void HandleAuthStateChanged(UAuthStateChangeReason reason) { } + private void EvaluateAuthorization() + { + var attr = GetType() + .GetCustomAttributes(typeof(UAuthAuthorizeAttribute), true) + .FirstOrDefault() as UAuthAuthorizeAttribute; + + if (attr is null) + return; + + if (_rendered && !AuthState.IsAuthenticated) + { + OnUnauthorized(); + return; + } + + if (_rendered && !string.IsNullOrEmpty(attr.Roles)) + { + var roles = attr.Roles.Split(','); + + if (!roles.Any(r => AuthState.IsInRole(r.Trim()))) + { + OnForbidden(); + return; + } + } + + if (_rendered && !string.IsNullOrEmpty(attr.Permissions)) + { + var permissions = attr.Permissions.Split(','); + + if (!permissions.Any(p => AuthState.HasPermission(p.Trim()))) + { + OnForbidden(); + return; + } + } + } + + protected virtual void OnUnauthorized() + { + Nav.NavigateTo("/"); + } + + protected virtual void OnForbidden() + { + Nav.NavigateTo("/forbidden"); + } + public virtual void Dispose() { if (_previousState is not null) From b1915b5257541809112a59b2b137cd2362850349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20Can=20Karag=C3=B6z?= Date: Mon, 20 Apr 2026 14:04:31 +0300 Subject: [PATCH 2/2] Arrange Samples --- .../uauthhub.db-shm | Bin 32768 -> 32768 bytes .../uauthhub.db-wal | Bin 898192 -> 716912 bytes .../Components/Pages/Home.razor | 2 +- .../Components/Pages/Home.razor | 2 +- .../Pages/Home.razor | 2 +- .../Pages/Home.razor | 3 +-- .../Components/Base/UAuthFlowPageBase.cs | 1 - 7 files changed, 4 insertions(+), 6 deletions(-) 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 64e200c5e95af84cc367412a0e1d6236f4b6f4fd..3490745a1d6fba8b0dd9351709332192d43642f9 100644 GIT binary patch delta 438 zcmZo@U}|V!s+V}A%K!pmK+MR%Ag~Td`v9@RffApCS5eR zzT^TC_~Qx@*nGkL8Y5V0^EodV>x{1sBT(B4MpLjUj0%%KGOwIm64(S5G=m5#f&@1g zg@iGIL^l_NLl~3uqQJ^F&xnS~OpAkfPcosd v+mQ`*i9J|i^R_%F-vPqkQV4VNrV(LN delta 595 zcmb7=+bcv-6vo#&yHVzayihI;(oo}4E~OO1NQnoxQA#N(JP65@Vut@fyZi%_=H(P) zn{mI4`(-dQ7|e^3yn83s+1rCRS@m^(>s#MmwT{Q5c|4jsRX?`h9n#uN)FhE|NET8qDUXy-`fFyU zObRKLWZaNN%I0HOZb~LH^J=sT2ivS+WpF3#%!>TZuH&_stuI2nS5C~K;|;g7Y5viu zV_cdd(iBI0P<-7?{HQqGYD3c!1Yw6>cv&SpNuOCDM23$~w9T<)SR-C!Rgh4_TsSa> zV!YF-;i1IQZl}iluxGypD-08F% 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 8abfdc323ec90ecb4ebad7a66c8d88c32b923bbf..d3a275a65698a55dc74f5ad03e7be06c5ca87321 100644 GIT binary patch delta 8708 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 DoH;YW delta 12917 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