diff --git a/samples/Balosar/Balosar.Client/Pages/FetchData.razor b/samples/Balosar/Balosar.Client/Pages/FetchData.razor index a91e0d06..d8319c8f 100644 --- a/samples/Balosar/Balosar.Client/Pages/FetchData.razor +++ b/samples/Balosar/Balosar.Client/Pages/FetchData.razor @@ -2,7 +2,7 @@ @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @attribute [Authorize] -@inject HttpClient Http +@inject HttpClient HttpClient

Weather forecast

@@ -44,8 +44,9 @@ else { try { - forecasts = (await Http.GetFromJsonAsync("WeatherForecast"))!; + forecasts = (await HttpClient.GetFromJsonAsync("WeatherForecast"))!; } + catch (AccessTokenNotAvailableException exception) { exception.Redirect(); diff --git a/samples/Balosar/Balosar.Client/Shared/LoginDisplay.razor b/samples/Balosar/Balosar.Client/Shared/LoginDisplay.razor index 49d7aea6..af49e8fb 100644 --- a/samples/Balosar/Balosar.Client/Shared/LoginDisplay.razor +++ b/samples/Balosar/Balosar.Client/Shared/LoginDisplay.razor @@ -1,7 +1,7 @@ @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.WebAssembly.Authentication -@inject NavigationManager Navigation +@inject NavigationManager NavigationManager @@ -17,6 +17,6 @@ @code{ private void BeginSignOut(MouseEventArgs args) { - Navigation.NavigateToLogout("authentication/logout"); + NavigationManager.NavigateToLogout("authentication/logout"); } } diff --git a/samples/Balosar/Balosar.Client/Shared/RedirectToLogin.razor b/samples/Balosar/Balosar.Client/Shared/RedirectToLogin.razor index b535ae42..48db2f82 100644 --- a/samples/Balosar/Balosar.Client/Shared/RedirectToLogin.razor +++ b/samples/Balosar/Balosar.Client/Shared/RedirectToLogin.razor @@ -1,8 +1,9 @@ -@inject NavigationManager Navigation +@inject NavigationManager NavigationManager @using Microsoft.AspNetCore.Components.WebAssembly.Authentication + @code { protected override void OnInitialized() { - Navigation.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}"); + NavigationManager.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(NavigationManager.Uri)}"); } } diff --git a/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/DownstreamApi.razor b/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/DownstreamApi.razor index 0813a424..ad8a2ea7 100644 --- a/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/DownstreamApi.razor +++ b/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/DownstreamApi.razor @@ -1,9 +1,9 @@ @page "/downstream-api" @using System.Net -@inject HttpClient client -@inject NavigationManager manager -@inject AuthenticationStateProvider provider -@inject IJSRuntime runtime +@inject AuthenticationStateProvider AuthenticationStateProvider +@inject HttpClient HttpClient +@inject NavigationManager NavigationManager +@inject IJSRuntime JSRuntime

Data retrieved from downstream API via YARP

@@ -35,23 +35,23 @@ else protected override async Task OnInitializedAsync() { - var state = await provider.GetAuthenticationStateAsync(); + var state = await AuthenticationStateProvider.GetAuthenticationStateAsync(); if (state is not { User.Identity.IsAuthenticated: true }) { - manager.NavigateTo($"login?returnUrl=/{Uri.EscapeDataString(manager.ToBaseRelativePath(manager.Uri))}", true); + NavigationManager.NavigateTo($"login?returnUrl={Uri.EscapeDataString("/" + NavigationManager.ToBaseRelativePath(NavigationManager.Uri))}", true); return; } - client.DefaultRequestHeaders.Add("X-XSRF-TOKEN", await runtime.InvokeAsync("getAntiForgeryToken")); + HttpClient.DefaultRequestHeaders.Add("X-XSRF-TOKEN", await JSRuntime.InvokeAsync("getAntiForgeryToken")); try { - data = (await client.GetFromJsonAsync("api/downstream-api"))!; + data = (await HttpClient.GetFromJsonAsync("api/downstream-api"))!; } catch (HttpRequestException exception) when (exception.StatusCode is HttpStatusCode.Unauthorized) { - manager.NavigateTo($"login?returnUrl=/{Uri.EscapeDataString(manager.ToBaseRelativePath(manager.Uri))}", true); + NavigationManager.NavigateTo($"login?returnUrl={Uri.EscapeDataString("/" + NavigationManager.ToBaseRelativePath(NavigationManager.Uri))}", true); return; } } diff --git a/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/LocalApi.razor b/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/LocalApi.razor index e2e1270f..719ff1c7 100644 --- a/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/LocalApi.razor +++ b/samples/Dantooine/Dantooine.WebAssembly.Client/Pages/LocalApi.razor @@ -1,9 +1,9 @@ @page "/local-api" @using System.Net -@inject HttpClient client -@inject NavigationManager manager -@inject AuthenticationStateProvider provider -@inject IJSRuntime runtime +@inject AuthenticationStateProvider AuthenticationStateProvider +@inject HttpClient HttpClient +@inject NavigationManager NavigationManager +@inject IJSRuntime JSRuntime

Data from local API

@@ -35,23 +35,23 @@ else protected override async Task OnInitializedAsync() { - var state = await provider.GetAuthenticationStateAsync(); + var state = await AuthenticationStateProvider.GetAuthenticationStateAsync(); if (state is not { User.Identity.IsAuthenticated: true }) { - manager.NavigateTo($"login?returnUrl=/{Uri.EscapeDataString(manager.ToBaseRelativePath(manager.Uri))}", true); + NavigationManager.NavigateTo($"login?returnUrl={Uri.EscapeDataString("/" + NavigationManager.ToBaseRelativePath(NavigationManager.Uri))}", true); return; } - client.DefaultRequestHeaders.Add("X-XSRF-TOKEN", await runtime.InvokeAsync("getAntiForgeryToken")); + HttpClient.DefaultRequestHeaders.Add("X-XSRF-TOKEN", await JSRuntime.InvokeAsync("getAntiForgeryToken")); try { - data = (await client.GetFromJsonAsync("api/local-api"))!; + data = (await HttpClient.GetFromJsonAsync("api/local-api"))!; } catch (HttpRequestException exception) when (exception.StatusCode is HttpStatusCode.Unauthorized) { - manager.NavigateTo($"login?returnUrl=/{Uri.EscapeDataString(manager.ToBaseRelativePath(manager.Uri))}", true); + NavigationManager.NavigateTo($"login?returnUrl={Uri.EscapeDataString("/" + NavigationManager.ToBaseRelativePath(NavigationManager.Uri))}", true); return; } } diff --git a/samples/Dantooine/Dantooine.WebAssembly.Client/Shared/LoginDisplay.razor b/samples/Dantooine/Dantooine.WebAssembly.Client/Shared/LoginDisplay.razor index d4b1fb0d..5795a4f8 100644 --- a/samples/Dantooine/Dantooine.WebAssembly.Client/Shared/LoginDisplay.razor +++ b/samples/Dantooine/Dantooine.WebAssembly.Client/Shared/LoginDisplay.razor @@ -1,7 +1,7 @@ @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.WebAssembly.Authentication -@inject NavigationManager Navigation +@inject NavigationManager NavigationManager @@ -16,6 +16,6 @@ @code{ private void BeginLogout(MouseEventArgs args) { - Navigation.NavigateToLogout("authentication/logout"); + NavigationManager.NavigateToLogout("authentication/logout"); } } diff --git a/samples/Geonosis/Geonosis.Api/Program.cs b/samples/Geonosis/Geonosis.Api/Program.cs index 9c69e4e8..a81909c4 100644 --- a/samples/Geonosis/Geonosis.Api/Program.cs +++ b/samples/Geonosis/Geonosis.Api/Program.cs @@ -1,9 +1,6 @@ using OpenIddict.Abstractions; using OpenIddict.Validation.AspNetCore; -var issuerUrl = "https://localhost:7094"; -var weatherReadAuthPolicy = "Weather.Read"; - var builder = WebApplication.CreateBuilder(args); builder.AddServiceDefaults(); @@ -13,7 +10,7 @@ .AddValidation(options => { // Set the authority and the audience to validate the tokens. - options.SetIssuer(issuerUrl); + options.SetIssuer("https://localhost:7094/"); options.AddAudiences("geonosis-api"); // Register the System.Net.Http integration. @@ -29,7 +26,7 @@ // Add a policy that requires the "Weather.Read" scope. builder.Services.AddAuthorizationBuilder() - .AddPolicy(weatherReadAuthPolicy, policy => policy + .AddPolicy("Weather.Read", policy => policy .RequireAuthenticatedUser() .RequireAssertion(context => context.User.HasScope("Weather.Read"))); @@ -44,24 +41,24 @@ // A sample endpoint that requires the "Weather.Read" scope to be accessed. app.MapGet("/weather-forecast", () => - { - string[] summaries = - [ - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - ]; - - var forecast = Enumerable.Range(1, 5).Select(index => - new WeatherForecast - ( - DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - Random.Shared.Next(-20, 55), - summaries[Random.Shared.Next(summaries.Length)] - )) - .ToArray(); - - return forecast; - }) - .RequireAuthorization(weatherReadAuthPolicy); +{ + string[] summaries = + [ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + ]; + + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + + return forecast; +}) +.RequireAuthorization("Weather.Read"); app.Run(); diff --git a/samples/Geonosis/Geonosis.AppHost/AppHost.cs b/samples/Geonosis/Geonosis.AppHost/AppHost.cs index 0138ae88..d154f201 100644 --- a/samples/Geonosis/Geonosis.AppHost/AppHost.cs +++ b/samples/Geonosis/Geonosis.AppHost/AppHost.cs @@ -1,12 +1,13 @@ var builder = DistributedApplication.CreateBuilder(args); -var geonosisAuth = builder.AddProject("geonosis-auth"); +var server = builder.AddProject("geonosis-auth"); -var geonosisApi = builder.AddProject("geonosis-api") - .WaitFor(geonosisAuth); +var resource = builder.AddProject("geonosis-api") + .WaitFor(server); builder.AddProject("geonosis-ui") - .WaitFor(geonosisAuth) - .WaitFor(geonosisApi); + .WaitFor(server) + .WaitFor(resource); -builder.Build().Run(); +var app = builder.Build(); +await app.RunAsync(); diff --git a/samples/Geonosis/Geonosis.Auth/Program.cs b/samples/Geonosis/Geonosis.Auth/Program.cs index c98dc671..fec758de 100644 --- a/samples/Geonosis/Geonosis.Auth/Program.cs +++ b/samples/Geonosis/Geonosis.Auth/Program.cs @@ -19,7 +19,7 @@ builder.Services.AddDbContext(options => { // Configure the context to use sqlite. - options.UseSqlite($"Filename={Path.Combine(Path.GetTempPath(), "geonosis-auth.sqlite3")}"); + options.UseSqlite($"Filename={Path.Combine(Path.GetTempPath(), "openiddict-geonosis-auth.sqlite3")}"); // Register the entity sets needed by OpenIddict. // Note: use the generic overload if you need @@ -222,8 +222,6 @@ static async Task SeedClientsAsync(IServiceProvider provider) """)) } }, - // RedirectUris must match the URLs used by the Blazor Web application during the authentication process - // These URLs are where the authorization server will redirect the user after login/logout back to the client application RedirectUris = { new Uri("http://localhost:5027/authentication/login-callback/local"), diff --git a/samples/Geonosis/Geonosis.Ui/Geonosis.Ui.Client/Constants.cs b/samples/Geonosis/Geonosis.Ui/Geonosis.Ui.Client/Constants.cs deleted file mode 100644 index e800c441..00000000 --- a/samples/Geonosis/Geonosis.Ui/Geonosis.Ui.Client/Constants.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Geonosis.Ui.Client -{ - public static class Constants - { - public const string LoginPath = "/authentication/login"; - public const string LogoutPath = "/authentication/logout"; - } -} diff --git a/samples/Geonosis/Geonosis.Ui/Geonosis.Ui.Client/Layout/MainLayout.razor b/samples/Geonosis/Geonosis.Ui/Geonosis.Ui.Client/Layout/MainLayout.razor index d1590893..fc95aa04 100644 --- a/samples/Geonosis/Geonosis.Ui/Geonosis.Ui.Client/Layout/MainLayout.razor +++ b/samples/Geonosis/Geonosis.Ui/Geonosis.Ui.Client/Layout/MainLayout.razor @@ -1,4 +1,4 @@ -@inject NavigationManager Navigation +@inject NavigationManager NavigationManager @inherits LayoutComponentBase @@ -14,7 +14,7 @@ @(authContext.User.Identity!.Name) -
+ @@ -26,13 +26,13 @@ try { // Ask OpenIddict to initiate the authentication flow (typically, by starting the system browser). - var result = await service.ChallengeInteractivelyAsync(new() + var result = await ClientService.ChallengeInteractivelyAsync(new() { CancellationToken = source.Token }); // Wait for the user to complete the authorization process. - var principal = (await service.AuthenticateInteractivelyAsync(new() + var principal = (await ClientService.AuthenticateInteractivelyAsync(new() { CancellationToken = source.Token, Nonce = result.Nonce