|
6 | 6 | using Microsoft.AspNetCore.WebUtilities; |
7 | 7 | using MudBlazor; |
8 | 8 |
|
9 | | -namespace CodeBeam.UltimateAuth.Sample.UAuthHub.Components.Pages |
| 9 | +namespace CodeBeam.UltimateAuth.Sample.UAuthHub.Components.Pages; |
| 10 | + |
| 11 | +public partial class Home |
10 | 12 | { |
11 | | - public partial class Home |
12 | | - { |
13 | | - [SupplyParameterFromQuery(Name = "hub")] |
14 | | - public string? HubKey { get; set; } |
| 13 | + [SupplyParameterFromQuery(Name = "hub")] |
| 14 | + public string? HubKey { get; set; } |
15 | 15 |
|
16 | | - private string? _username; |
17 | | - private string? _password; |
| 16 | + private string? _username; |
| 17 | + private string? _password; |
18 | 18 |
|
19 | | - private HubFlowState? _state; |
| 19 | + private HubFlowState? _state; |
20 | 20 |
|
21 | | - protected override async Task OnParametersSetAsync() |
| 21 | + protected override async Task OnParametersSetAsync() |
| 22 | + { |
| 23 | + if (string.IsNullOrWhiteSpace(HubKey)) |
22 | 24 | { |
23 | | - if (string.IsNullOrWhiteSpace(HubKey)) |
24 | | - { |
25 | | - _state = null; |
26 | | - return; |
27 | | - } |
28 | | - |
29 | | - if (!HubSessionId.TryParse(HubKey, out var hubSessionId)) |
30 | | - _state = await HubFlowReader.GetStateAsync(hubSessionId); |
| 25 | + _state = null; |
| 26 | + return; |
31 | 27 | } |
32 | 28 |
|
33 | | - protected override async Task OnAfterRenderAsync(bool firstRender) |
34 | | - { |
35 | | - if (!firstRender) |
36 | | - return; |
37 | | - |
38 | | - var currentError = await BrowserStorage.GetAsync(StorageScope.Session, "uauth:last_error"); |
39 | | - |
40 | | - if (!string.IsNullOrWhiteSpace(currentError)) |
41 | | - { |
42 | | - Snackbar.Add(ResolveErrorMessage(currentError), Severity.Error); |
43 | | - await BrowserStorage.RemoveAsync(StorageScope.Session, "uauth:last_error"); |
44 | | - } |
45 | | - |
46 | | - var uri = Nav.ToAbsoluteUri(Nav.Uri); |
47 | | - var query = QueryHelpers.ParseQuery(uri.Query); |
48 | | - |
49 | | - if (query.TryGetValue("__uauth_error", out var error)) |
50 | | - { |
51 | | - await BrowserStorage.SetAsync(StorageScope.Session, "uauth:last_error", error.ToString()); |
52 | | - } |
53 | | - |
54 | | - if (string.IsNullOrWhiteSpace(HubKey)) |
55 | | - { |
56 | | - return; |
57 | | - } |
58 | | - |
59 | | - if (_state is null || !_state.Exists) |
60 | | - return; |
61 | | - |
62 | | - if (_state?.IsActive != true) |
63 | | - { |
64 | | - await StartNewPkceAsync(); |
65 | | - return; |
66 | | - } |
67 | | - } |
| 29 | + if (HubSessionId.TryParse(HubKey, out var hubSessionId)) |
| 30 | + _state = await HubFlowReader.GetStateAsync(hubSessionId); |
| 31 | + } |
68 | 32 |
|
69 | | - // For testing & debugging |
70 | | - private async Task ProgrammaticPkceLogin() |
71 | | - { |
72 | | - var hub = _state; |
| 33 | + protected override async Task OnAfterRenderAsync(bool firstRender) |
| 34 | + { |
| 35 | + if (!firstRender) |
| 36 | + return; |
73 | 37 |
|
74 | | - if (hub is null) |
75 | | - return; |
| 38 | + var currentError = await BrowserStorage.GetAsync(StorageScope.Session, "uauth:last_error"); |
76 | 39 |
|
77 | | - if (!HubSessionId.TryParse(HubKey, out var hubSessionId)) |
78 | | - return; |
| 40 | + if (!string.IsNullOrWhiteSpace(currentError)) |
| 41 | + { |
| 42 | + Snackbar.Add(ResolveErrorMessage(currentError), Severity.Error); |
| 43 | + await BrowserStorage.RemoveAsync(StorageScope.Session, "uauth:last_error"); |
| 44 | + } |
79 | 45 |
|
80 | | - var credentials = await HubCredentialResolver.ResolveAsync(hubSessionId); |
| 46 | + var uri = Nav.ToAbsoluteUri(Nav.Uri); |
| 47 | + var query = QueryHelpers.ParseQuery(uri.Query); |
81 | 48 |
|
82 | | - var request = new PkceLoginRequest |
83 | | - { |
84 | | - Identifier = "admin", |
85 | | - Secret = "admin", |
86 | | - AuthorizationCode = credentials?.AuthorizationCode ?? string.Empty, |
87 | | - CodeVerifier = credentials?.CodeVerifier ?? string.Empty, |
88 | | - ReturnUrl = _state?.ReturnUrl ?? string.Empty |
89 | | - }; |
90 | | - await UAuthClient.Flows.CompletePkceLoginAsync(request); |
| 49 | + if (query.TryGetValue("__uauth_error", out var error)) |
| 50 | + { |
| 51 | + await BrowserStorage.SetAsync(StorageScope.Session, "uauth:last_error", error.ToString()); |
| 52 | + } |
| 53 | + |
| 54 | + if (string.IsNullOrWhiteSpace(HubKey)) |
| 55 | + { |
| 56 | + return; |
91 | 57 | } |
92 | 58 |
|
93 | | - private async Task StartNewPkceAsync() |
| 59 | + if (_state is null || !_state.Exists) |
| 60 | + return; |
| 61 | + |
| 62 | + if (_state?.IsActive != true) |
94 | 63 | { |
95 | | - var returnUrl = await ResolveReturnUrlAsync(); |
96 | | - await UAuthClient.Flows.BeginPkceAsync(returnUrl); |
| 64 | + await StartNewPkceAsync(); |
| 65 | + return; |
97 | 66 | } |
| 67 | + } |
98 | 68 |
|
99 | | - private async Task<string> ResolveReturnUrlAsync() |
| 69 | + // For testing & debugging |
| 70 | + private async Task ProgrammaticPkceLogin() |
| 71 | + { |
| 72 | + var hub = _state; |
| 73 | + |
| 74 | + if (hub is null) |
| 75 | + return; |
| 76 | + |
| 77 | + if (!HubSessionId.TryParse(HubKey, out var hubSessionId)) |
| 78 | + return; |
| 79 | + |
| 80 | + var credentials = await HubCredentialResolver.ResolveAsync(hubSessionId); |
| 81 | + |
| 82 | + var request = new PkceLoginRequest |
100 | 83 | { |
101 | | - var fromContext = _state?.ReturnUrl; |
102 | | - if (!string.IsNullOrWhiteSpace(fromContext)) |
103 | | - return fromContext; |
| 84 | + Identifier = "admin", |
| 85 | + Secret = "admin", |
| 86 | + AuthorizationCode = credentials?.AuthorizationCode ?? string.Empty, |
| 87 | + CodeVerifier = credentials?.CodeVerifier ?? string.Empty, |
| 88 | + ReturnUrl = _state?.ReturnUrl ?? string.Empty |
| 89 | + }; |
| 90 | + await UAuthClient.Flows.CompletePkceLoginAsync(request); |
| 91 | + } |
104 | 92 |
|
105 | | - var uri = Nav.ToAbsoluteUri(Nav.Uri); |
106 | | - var query = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query); |
| 93 | + private async Task StartNewPkceAsync() |
| 94 | + { |
| 95 | + var returnUrl = await ResolveReturnUrlAsync(); |
| 96 | + await UAuthClient.Flows.BeginPkceAsync(returnUrl); |
| 97 | + } |
107 | 98 |
|
108 | | - if (query.TryGetValue("return_url", out var ru) && !string.IsNullOrWhiteSpace(ru)) |
109 | | - return ru!; |
| 99 | + private async Task<string> ResolveReturnUrlAsync() |
| 100 | + { |
| 101 | + var fromContext = _state?.ReturnUrl; |
| 102 | + if (!string.IsNullOrWhiteSpace(fromContext)) |
| 103 | + return fromContext; |
110 | 104 |
|
111 | | - if (query.TryGetValue("hub", out var hubKey) && !string.IsNullOrWhiteSpace(hubKey)) |
112 | | - { |
113 | | - var artifact = await AuthStore.GetAsync(new AuthArtifactKey(hubKey!)); |
114 | | - if (artifact is HubFlowArtifact flow && !string.IsNullOrWhiteSpace(flow.ReturnUrl)) |
115 | | - return flow.ReturnUrl!; |
116 | | - } |
| 105 | + var uri = Nav.ToAbsoluteUri(Nav.Uri); |
| 106 | + var query = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query); |
117 | 107 |
|
118 | | - // Config default (recommend adding to options) |
119 | | - //if (!string.IsNullOrWhiteSpace(_options.Login.DefaultReturnUrl)) |
120 | | - // return _options.Login.DefaultReturnUrl!; |
| 108 | + if (query.TryGetValue("return_url", out var ru) && !string.IsNullOrWhiteSpace(ru)) |
| 109 | + return ru!; |
121 | 110 |
|
122 | | - return Nav.Uri; |
123 | | - } |
124 | | - |
125 | | - private string ResolveErrorMessage(string? errorKey) |
| 111 | + if (query.TryGetValue("hub", out var hubKey) && !string.IsNullOrWhiteSpace(hubKey)) |
126 | 112 | { |
127 | | - if (errorKey == "invalid") |
128 | | - { |
129 | | - return "Login failed."; |
130 | | - } |
| 113 | + var artifact = await AuthStore.GetAsync(new AuthArtifactKey(hubKey!)); |
| 114 | + if (artifact is HubFlowArtifact flow && !string.IsNullOrWhiteSpace(flow.ReturnUrl)) |
| 115 | + return flow.ReturnUrl!; |
| 116 | + } |
| 117 | + |
| 118 | + // Config default (recommend adding to options) |
| 119 | + //if (!string.IsNullOrWhiteSpace(_options.Login.DefaultReturnUrl)) |
| 120 | + // return _options.Login.DefaultReturnUrl!; |
131 | 121 |
|
132 | | - return "Failed attempt."; |
| 122 | + return Nav.Uri; |
| 123 | + } |
| 124 | + |
| 125 | + private string ResolveErrorMessage(string? errorKey) |
| 126 | + { |
| 127 | + if (errorKey == "invalid") |
| 128 | + { |
| 129 | + return "Login failed."; |
133 | 130 | } |
134 | 131 |
|
| 132 | + return "Failed attempt."; |
135 | 133 | } |
| 134 | + |
136 | 135 | } |
0 commit comments