5 Commits

Author SHA1 Message Date
e5bfda69a6 Add keycloak users to export 2025-08-03 19:08:10 +02:00
49c88bdb66 Fix service reference 2025-08-03 19:05:43 +02:00
e65052d7f4 Fix api startup 2025-08-03 12:50:14 +02:00
7abea2ee50 Add Keycloak realm import 2025-08-03 12:50:05 +02:00
c981b24c60 WIP: Add Keycloak jwt bearer 2025-08-03 12:19:29 +02:00
11 changed files with 2157 additions and 20 deletions

View File

@@ -4,21 +4,29 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Aspire.Hosting.AppHost" Version="9.0.0" />
<PackageVersion Include="Aspire.Hosting.Redis" Version="9.0.0" />
<PackageVersion Include="Aspire.Hosting.Testing" Version="9.0.0" />
<PackageVersion Include="Aspire.StackExchange.Redis.OutputCaching" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="9.0.0" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="9.0.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.9.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.9.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
<PackageVersion Include="xunit" Version="2.9.0" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="Aspire.Hosting.AppHost" Version="9.4.0" />
<PackageVersion Include="Aspire.Hosting.Keycloak" Version="9.4.0-preview.1.25378.8" />
<PackageVersion Include="Aspire.Hosting.Redis" Version="9.4.0" />
<PackageVersion Include="Aspire.Hosting.Testing" Version="9.4.0" />
<PackageVersion Include="Aspire.Keycloak.Authentication" Version="9.4.0-preview.1.25378.8" />
<PackageVersion Include="Aspire.StackExchange.Redis.OutputCaching" Version="9.4.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.7" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="9.7.0" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="9.4.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageVersion>
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageVersion>
</ItemGroup>
</Project>

View File

@@ -8,10 +8,16 @@
<ItemGroup>
<ProjectReference Include="..\PresentPortal.ServiceDefaults\PresentPortal.ServiceDefaults.csproj" />
<ProjectReference Include="..\PresentPortal.Shared\PresentPortal.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aspire.Keycloak.Authentication" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
</Project>

View File

@@ -1,3 +1,5 @@
using PresentPortal.Shared;
var builder = WebApplication.CreateBuilder(args);
// Add service defaults & Aspire client integrations.
@@ -9,6 +11,15 @@ builder.Services.AddProblemDetails();
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
builder.Services.AddAuthentication()
.AddKeycloakJwtBearer(ServiceNames.Keycloak, "TODO", options =>
{
options.Audience = "TODO";
options.Authority = "TODO";
// options.
});
builder.Services.AddAuthorization();
var app = builder.Build();
// Configure the HTTP request pipeline.
@@ -19,6 +30,9 @@ if (app.Environment.IsDevelopment())
app.MapOpenApi();
}
app.UseAuthentication();
app.UseAuthorization();
string[] summaries =
["Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"];
@@ -34,7 +48,8 @@ app.MapGet("/weatherforecast", () =>
.ToArray();
return forecast;
})
.WithName("GetWeatherForecast");
.WithName("GetWeatherForecast")
.RequireAuthorization();
app.MapDefaultEndpoints();

View File

@@ -13,12 +13,20 @@
<ItemGroup>
<ProjectReference Include="..\PresentPortal.ApiService\PresentPortal.ApiService.csproj"/>
<ProjectReference Include="..\PresentPortal.Shared\PresentPortal.Shared.csproj" IsAspireProjectResource="false" />
<ProjectReference Include="..\PresentPortal.Web\PresentPortal.Web.csproj"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" />
<PackageReference Include="Aspire.Hosting.Keycloak" />
<PackageReference Include="Aspire.Hosting.Redis" />
</ItemGroup>
<ItemGroup>
<None Update="Resources\present-portal.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -1,8 +1,18 @@
using PresentPortal.Shared;
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
var apiService = builder.AddProject<Projects.PresentPortal_ApiService>("apiservice");
var keycloak = builder.AddKeycloak(ServiceNames.Keycloak, 8080)
.WithRealmImport(@"Resources\present-portal-realm.json")
.WithDataVolume()
.WithExternalHttpEndpoints()
.WithLifetime(ContainerLifetime.Persistent);
var apiService = builder.AddProject<Projects.PresentPortal_ApiService>(ServiceNames.Api)
.WithReference(keycloak)
.WaitFor(keycloak);
builder.AddProject<Projects.PresentPortal_Web>("webfrontend")
.WithExternalHttpEndpoints()
@@ -11,4 +21,4 @@ builder.AddProject<Projects.PresentPortal_Web>("webfrontend")
.WithReference(apiService)
.WaitFor(apiService);
builder.Build().Run();
builder.Build().Run();

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,8 @@
namespace PresentPortal.Shared;
public static class ServiceNames
{
public const string Api = "Api";
public const string Keycloak = "Keycloak";
}

View File

@@ -8,6 +8,7 @@
<ItemGroup>
<ProjectReference Include="..\PresentPortal.ServiceDefaults\PresentPortal.ServiceDefaults.csproj"/>
<ProjectReference Include="..\PresentPortal.Shared\PresentPortal.Shared.csproj" />
</ItemGroup>
<ItemGroup>

View File

@@ -1,3 +1,4 @@
using PresentPortal.Shared;
using PresentPortal.Web;
using PresentPortal.Web.Components;
@@ -15,7 +16,7 @@ builder.Services.AddHttpClient<WeatherApiClient>(client =>
{
// This URL uses "https+http://" to indicate HTTPS is preferred over HTTP.
// Learn more about service discovery scheme resolution at https://aka.ms/dotnet/sdschemes.
client.BaseAddress = new("https+http://apiservice");
client.BaseAddress = new($"https+http://{ServiceNames.Api}");
});
var app = builder.Build();

View File

@@ -5,6 +5,7 @@
<Project Path="PresentPortal.ApiService\PresentPortal.ApiService.csproj" Type="Classic C#" />
<Project Path="PresentPortal.AppHost\PresentPortal.AppHost.csproj" Type="Classic C#" />
<Project Path="PresentPortal.ServiceDefaults\PresentPortal.ServiceDefaults.csproj" Type="Classic C#" />
<Project Path="PresentPortal.Shared\PresentPortal.Shared.csproj" Type="Classic C#" />
<Project Path="PresentPortal.Tests\PresentPortal.Tests.csproj" Type="Classic C#" />
<Project Path="PresentPortal.Web\PresentPortal.Web.csproj" Type="Classic C#" />
</Solution>