Publish - 2026-05-22 13:27:37 UTC

This commit is contained in:
Duende Bot 2026-05-22 13:27:41 +00:00
parent dd6e90d083
commit 2b7da400b8
14 changed files with 89 additions and 112 deletions

View file

@ -88,3 +88,5 @@ dotnet_naming_rule.async_methods_must_end_with_async.severity = none
[platform/src/AdminStudio.Web/Services/*GrpcService.cs]
dotnet_naming_rule.async_methods_must_end_with_async.severity = none

View file

@ -1,39 +0,0 @@
{
"solution": {
"path": "..\\products.slnx",
"projects": [
"bff\\hosts\\Blazor\\PerComponent\\Hosts.Bff.Blazor.PerComponent.Client\\Hosts.Bff.Blazor.PerComponent.Client.csproj",
"bff\\hosts\\Blazor\\PerComponent\\Hosts.Bff.Blazor.PerComponent\\Hosts.Bff.Blazor.PerComponent.csproj",
"bff\\hosts\\Blazor\\WebAssembly\\Hosts.Bff.Blazor.WebAssembly.Client\\Hosts.Bff.Blazor.WebAssembly.Client.csproj",
"bff\\hosts\\Blazor\\WebAssembly\\Hosts.Bff.Blazor.WebAssembly\\Hosts.Bff.Blazor.WebAssembly.csproj",
"bff\\hosts\\Hosts.AppHost\\Hosts.AppHost.csproj",
"bff\\hosts\\Hosts.Bff.DPoP\\Hosts.Bff.DPoP.csproj",
"bff\\hosts\\Hosts.Bff.EF\\Hosts.Bff.EF.csproj",
"bff\\hosts\\Hosts.Bff.InMemory\\Hosts.Bff.InMemory.csproj",
"bff\\hosts\\Hosts.Bff.MultiFrontend\\Hosts.Bff.MultiFrontend.csproj",
"bff\\hosts\\Hosts.Bff.Performance\\Hosts.Bff.Performance.csproj",
"bff\\hosts\\Hosts.IdentityServer\\Hosts.IdentityServer.csproj",
"bff\\hosts\\Hosts.ServiceDefaults\\Hosts.ServiceDefaults.csproj",
"bff\\hosts\\RemoteApis\\Hosts.RemoteApi.DPoP\\Hosts.RemoteApi.DPoP.csproj",
"bff\\hosts\\RemoteApis\\Hosts.RemoteApi.Isolated\\Hosts.RemoteApi.Isolated.csproj",
"bff\\hosts\\RemoteApis\\Hosts.RemoteApi\\Hosts.RemoteApi.csproj",
"bff\\migrations\\UserSessionDb\\UserSessionDb.csproj",
"bff\\performance\\Bff.Benchmarks\\Bff.Benchmarks.csproj",
"bff\\performance\\Bff.Performance\\Bff.Performance.csproj",
"bff\\src\\Bff.Blazor.Client\\Bff.Blazor.Client.csproj",
"bff\\src\\Bff.Blazor\\Bff.Blazor.csproj",
"bff\\src\\Bff.EntityFramework\\Bff.EntityFramework.csproj",
"bff\\src\\Bff.Yarp\\Bff.Yarp.csproj",
"bff\\src\\Bff\\Bff.csproj",
"bff\\templates\\src\\BffBlazorAutoRenderMode\\BffBlazorAutoRenderMode.Client\\BffBlazorAutoRenderMode.Client.csproj",
"bff\\templates\\src\\BffBlazorAutoRenderMode\\BffBlazorAutoRenderMode\\BffBlazorAutoRenderMode.csproj",
"bff\\templates\\src\\BffLocalApi\\BffLocalApi.csproj",
"bff\\templates\\src\\BffRemoteApi\\BffRemoteApi.csproj",
"bff\\test\\Bff.Tests\\Bff.Tests.csproj",
"bff\\test\\Hosts.Tests\\Hosts.Tests.csproj",
"shared\\AppHost.Abstractions\\AppHost.Abstractions.csproj",
"shared\\ShouldlyExtensions\\ShouldlyExtensions.csproj",
"shared\\Xunit.Playwright\\Xunit.Playwright.csproj"
]
}
}

61
bff/bff.slnx Normal file
View file

@ -0,0 +1,61 @@
<Solution>
<Folder Name="/hosts/">
<Project Path="hosts/Hosts.AppHost/Hosts.AppHost.csproj" />
<Project Path="hosts/Hosts.Bff.DPoP/Hosts.Bff.DPoP.csproj" />
<Project Path="hosts/Hosts.Bff.EF/Hosts.Bff.EF.csproj" />
<Project Path="hosts/Hosts.Bff.InMemory/Hosts.Bff.InMemory.csproj" />
<Project Path="hosts/Hosts.Bff.MultiFrontend/Hosts.Bff.MultiFrontend.csproj" />
<Project Path="hosts/Hosts.Bff.Performance/Hosts.Bff.Performance.csproj" />
<Project Path="hosts/Hosts.IdentityServer/Hosts.IdentityServer.csproj" />
<Project Path="hosts/Hosts.ServiceDefaults/Hosts.ServiceDefaults.csproj" />
</Folder>
<Folder Name="/hosts/Blazor/" />
<Folder Name="/hosts/Blazor/PerComponent/">
<Project Path="hosts/Blazor/PerComponent/Hosts.Bff.Blazor.PerComponent.Client/Hosts.Bff.Blazor.PerComponent.Client.csproj" />
<Project Path="hosts/Blazor/PerComponent/Hosts.Bff.Blazor.PerComponent/Hosts.Bff.Blazor.PerComponent.csproj" />
</Folder>
<Folder Name="/hosts/Blazor/WebAssembly/">
<Project Path="hosts/Blazor/WebAssembly/Hosts.Bff.Blazor.WebAssembly.Client/Hosts.Bff.Blazor.WebAssembly.Client.csproj" />
<Project Path="hosts/Blazor/WebAssembly/Hosts.Bff.Blazor.WebAssembly/Hosts.Bff.Blazor.WebAssembly.csproj" />
</Folder>
<Folder Name="/hosts/RemoteApis/">
<Project Path="hosts/RemoteApis/Hosts.RemoteApi.DPoP/Hosts.RemoteApi.DPoP.csproj" />
<Project Path="hosts/RemoteApis/Hosts.RemoteApi.Isolated/Hosts.RemoteApi.Isolated.csproj" />
<Project Path="hosts/RemoteApis/Hosts.RemoteApi/Hosts.RemoteApi.csproj" />
</Folder>
<Folder Name="/migrations/">
<Project Path="migrations/UserSessionDb/UserSessionDb.csproj" />
</Folder>
<Folder Name="/performance/">
<Project Path="performance/Bff.Benchmarks/Bff.Benchmarks.csproj" />
<Project Path="performance/Bff.Performance/Bff.Performance.csproj" />
</Folder>
<Folder Name="/src/">
<Project Path="src/Bff.Blazor.Client/Bff.Blazor.Client.csproj" />
<Project Path="src/Bff.Blazor/Bff.Blazor.csproj" />
<Project Path="src/Bff.EntityFramework/Bff.EntityFramework.csproj" />
<Project Path="src/Bff.Yarp/Bff.Yarp.csproj" />
<Project Path="src/Bff/Bff.csproj" />
</Folder>
<Folder Name="/templates/" />
<Folder Name="/templates/src/">
<Project Path="templates/src/BffLocalApi/BffLocalApi.csproj" />
<Project Path="templates/src/BffRemoteApi/BffRemoteApi.csproj" />
</Folder>
<Folder Name="/templates/src/BffBlazorAutoRenderMode/">
<Project Path="templates/src/BffBlazorAutoRenderMode/BffBlazorAutoRenderMode.Client/BffBlazorAutoRenderMode.Client.csproj" />
<Project Path="templates/src/BffBlazorAutoRenderMode/BffBlazorAutoRenderMode/BffBlazorAutoRenderMode.csproj" />
</Folder>
<Folder Name="/test/">
<Project Path="test/Bff.Tests/Bff.Tests.csproj" />
<Project Path="test/Hosts.Tests/Hosts.Tests.csproj" />
</Folder>
<Folder Name="/tools/">
<Project Path="tools/PublicApi/PublicApi.csproj" />
</Folder>
<Folder Name="/shared/">
<Project Path="../shared/AppHost.Abstractions/AppHost.Abstractions.csproj" />
<Project Path="../shared/ShouldlyExtensions/ShouldlyExtensions.csproj" />
<Project Path="../shared/Xunit.Playwright/Xunit.Playwright.csproj" />
</Folder>
</Solution>

View file

@ -21,5 +21,7 @@
<AnalysisMode>None</AnalysisMode>
<TargetFramework>net10.0</TargetFramework>
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
<!-- IDE1006: Naming rule violation (async suffix) - Razor Pages use OnGet/OnPost convention -->
<NoWarn>$(NoWarn);IDE1006</NoWarn>
</PropertyGroup>
</Project>

View file

@ -8,7 +8,7 @@
<PackageReference Include="Duende.IdentityServer" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\bff\hosts\Hosts.ServiceDefaults\Hosts.ServiceDefaults.csproj" />
<ProjectReference Include="..\Hosts.ServiceDefaults\Hosts.ServiceDefaults.csproj" />
<ProjectReference Include="..\..\src\Bff.Yarp\Bff.Yarp.csproj" />
</ItemGroup>
</Project>

View file

@ -18,7 +18,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\shared\AppHost.Abstractions\AppHost.Abstractions.csproj" />
<ProjectReference Include="..\..\..\..\shared\AppHost.Abstractions\AppHost.Abstractions.csproj" />
<ProjectReference Include="..\..\src\Bff\Bff.csproj" />
</ItemGroup>

View file

@ -2,7 +2,7 @@
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)..\'))" />
<Import Project="../../src.props" />
<Import Project="../../../src.props" />
<PropertyGroup>
<AnalysisMode>None</AnalysisMode>
@ -12,6 +12,9 @@
<!-- RS0027: API with optional parameter(s) should have the most parameters amongst its public overloads -->
<NoWarn>$(NoWarn);RS0027</NoWarn>
<!-- IDE1006: Naming rule violation (async suffix) - benchmark methods -->
<NoWarn>$(NoWarn);IDE1006</NoWarn>
</PropertyGroup>
</Project>

View file

@ -32,19 +32,19 @@ internal class BffClientAuthenticationStateProvider : AuthenticationStateProvide
_fetchUserService = fetchUserService;
_ = persistentUserService.GetPersistedUser(out var user);
_user = user;
_timer = timeProvider.CreateTimer(TimerCallback,
_timer = timeProvider.CreateTimer(TimerCallbackAsync,
null,
TimeSpan.FromMilliseconds(options.Value.WebAssemblyStateProviderPollingDelay),
TimeSpan.FromMilliseconds(options.Value.WebAssemblyStateProviderPollingInterval));
_logger = logger;
}
private async void TimerCallback(object? _)
private async void TimerCallbackAsync(object? _)
{
await _semaphore.WaitAsync();
try
{
_user = await RefreshUser();
_user = await RefreshUserAsync();
}
finally
{
@ -52,7 +52,7 @@ internal class BffClientAuthenticationStateProvider : AuthenticationStateProvide
}
}
private async Task<ClaimsPrincipal> RefreshUser()
private async Task<ClaimsPrincipal> RefreshUserAsync()
{
// We don't want to do any polling if we already know that the user is anonymous.
// There's no way for us to become authenticated without the server issuing a cookie
@ -94,7 +94,7 @@ internal class BffClientAuthenticationStateProvider : AuthenticationStateProvide
if (_user == null)
#pragma warning restore CA1508
{
_user = await RefreshUser();
_user = await RefreshUserAsync();
}
}
finally

View file

@ -35,7 +35,7 @@ internal class ServerSideTokenStore(
Ct ct = default)
{
logger.RetrievingTokenForUser(LogLevel.Debug, user.Identity?.Name);
var session = await GetSession(user);
var session = await GetSessionAsync(user);
if (session == null)
{
var anonymous = new ClaimsPrincipal(new ClaimsIdentity());
@ -50,7 +50,7 @@ internal class ServerSideTokenStore(
return tokensInAuthProperties.GetUserToken(ticket.Properties, parameters);
}
private async Task<UserSession?> GetSession(ClaimsPrincipal user)
private async Task<UserSession?> GetSessionAsync(ClaimsPrincipal user)
{
if (user.Identity?.IsAuthenticated == false)
{
@ -86,7 +86,7 @@ internal class ServerSideTokenStore(
UserTokenRequestParameters? parameters = null, Ct ct = default)
{
logger.StoringTokenForUser(LogLevel.Debug, user.Identity?.Name);
await UpdateTicket(user,
await UpdateTicketAsync(user,
async ticket => { await tokensInAuthProperties.SetUserTokenAsync(token, ticket.Properties, parameters, ct); });
}
@ -94,16 +94,16 @@ internal class ServerSideTokenStore(
public async Task ClearTokenAsync(ClaimsPrincipal user, UserTokenRequestParameters? parameters = null, Ct ct = default)
{
logger.RemovingTokenForUser(LogLevel.Debug, user.Identity?.Name);
await UpdateTicket(user, ticket =>
await UpdateTicketAsync(user, ticket =>
{
tokensInAuthProperties.RemoveUserToken(ticket.Properties, parameters);
return Task.CompletedTask;
});
}
protected async Task UpdateTicket(ClaimsPrincipal user, Func<AuthenticationTicket, Task> updateAction)
protected async Task UpdateTicketAsync(ClaimsPrincipal user, Func<AuthenticationTicket, Task> updateAction)
{
var session = await GetSession(user);
var session = await GetSessionAsync(user);
if (session == null)
{
logger.FailedToFindSessionToUpdate(LogLevel.Debug);

View file

@ -2,7 +2,7 @@
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)..\'))" />
<Import Project="../../src.props" />
<Import Project="../../../src.props" />
<PropertyGroup>
<PackageTags>OAuth 2.0;OpenID Connect;Security;BFF;IdentityServer;ASP.NET Core;SPA;Blazor</PackageTags>
@ -17,6 +17,9 @@
<!-- RS0027: API with optional parameter(s) should have the most parameters amongst its public overloads -->
<NoWarn>$(NoWarn);RS0027</NoWarn>
<!-- IDE1006: Naming rule violation (async suffix) - pre-existing in BFF code -->
<NoWarn>$(NoWarn);IDE1006</NoWarn>
</PropertyGroup>
</Project>

View file

@ -1,4 +1,4 @@
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.targets', '$(MSBuildThisFileDirectory)..\'))" />
<Import Project="../../src.targets" />
<Import Project="../../../src.targets" />
</Project>

View file

@ -33,5 +33,5 @@
<NoWarn>$(NoWarn);CA2201</NoWarn><!-- Do not raise reserved exception types -->
<NoWarn>$(NoWarn);CA2254</NoWarn><!-- Template should be a static expression -->
</PropertyGroup>
<Import Project="../../test.props" />
<Import Project="../../../test.props" />
</Project>

View file

@ -28,6 +28,6 @@
<Using Include="Xunit" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\shared\Xunit.Playwright\Xunit.Playwright.csproj" />
<ProjectReference Include="..\..\..\..\shared\Xunit.Playwright\Xunit.Playwright.csproj" />
</ItemGroup>
</Project>

View file

@ -30,61 +30,6 @@
<Folder Name="/cli/testing/">
<Project Path="cli/testing/Cli.TestPlugin/Cli.TestPlugin.csproj" />
</Folder>
<Folder Name="/bff/" />
<Folder Name="/bff/hosts/">
<Project Path="bff/hosts/Hosts.AppHost/Hosts.AppHost.csproj" />
<Project Path="bff/hosts/Hosts.Bff.DPoP/Hosts.Bff.DPoP.csproj" />
<Project Path="bff/hosts/Hosts.Bff.EF/Hosts.Bff.EF.csproj" />
<Project Path="bff/hosts/Hosts.Bff.InMemory/Hosts.Bff.InMemory.csproj" />
<Project Path="bff/hosts/Hosts.Bff.MultiFrontend/Hosts.Bff.MultiFrontend.csproj" />
<Project Path="bff/hosts/Hosts.Bff.Performance/Hosts.Bff.Performance.csproj" />
<Project Path="bff/hosts/Hosts.IdentityServer/Hosts.IdentityServer.csproj" />
<Project Path="bff/hosts/Hosts.ServiceDefaults/Hosts.ServiceDefaults.csproj" />
</Folder>
<Folder Name="/bff/hosts/Blazor/" />
<Folder Name="/bff/hosts/Blazor/PerComponent/">
<Project Path="bff/hosts/Blazor/PerComponent/Hosts.Bff.Blazor.PerComponent.Client/Hosts.Bff.Blazor.PerComponent.Client.csproj" />
<Project Path="bff/hosts/Blazor/PerComponent/Hosts.Bff.Blazor.PerComponent/Hosts.Bff.Blazor.PerComponent.csproj" />
</Folder>
<Folder Name="/bff/hosts/Blazor/WebAssembly/">
<Project Path="bff/hosts/Blazor/WebAssembly/Hosts.Bff.Blazor.WebAssembly.Client/Hosts.Bff.Blazor.WebAssembly.Client.csproj" />
<Project Path="bff/hosts/Blazor/WebAssembly/Hosts.Bff.Blazor.WebAssembly/Hosts.Bff.Blazor.WebAssembly.csproj" />
</Folder>
<Folder Name="/bff/hosts/RemoteApis/">
<Project Path="bff/hosts/RemoteApis/Hosts.RemoteApi.DPoP/Hosts.RemoteApi.DPoP.csproj" />
<Project Path="bff/hosts/RemoteApis/Hosts.RemoteApi.Isolated/Hosts.RemoteApi.Isolated.csproj" />
<Project Path="bff/hosts/RemoteApis/Hosts.RemoteApi/Hosts.RemoteApi.csproj" />
</Folder>
<Folder Name="/bff/migrations/">
<Project Path="bff/migrations/UserSessionDb/UserSessionDb.csproj" />
</Folder>
<Folder Name="/bff/performance/">
<Project Path="bff/performance/Bff.Benchmarks/Bff.Benchmarks.csproj" />
<Project Path="bff/performance/Bff.Performance/Bff.Performance.csproj" />
</Folder>
<Folder Name="/bff/src/">
<Project Path="bff/src/Bff.Blazor.Client/Bff.Blazor.Client.csproj" />
<Project Path="bff/src/Bff.Blazor/Bff.Blazor.csproj" />
<Project Path="bff/src/Bff.EntityFramework/Bff.EntityFramework.csproj" />
<Project Path="bff/src/Bff.Yarp/Bff.Yarp.csproj" />
<Project Path="bff/src/Bff/Bff.csproj" />
</Folder>
<Folder Name="/bff/templates/" />
<Folder Name="/bff/templates/src/">
<Project Path="bff/templates/src/BffLocalApi/BffLocalApi.csproj" />
<Project Path="bff/templates/src/BffRemoteApi/BffRemoteApi.csproj" />
</Folder>
<Folder Name="/bff/templates/src/BffBlazorAutoRenderMode/">
<Project Path="bff/templates/src/BffBlazorAutoRenderMode/BffBlazorAutoRenderMode.Client/BffBlazorAutoRenderMode.Client.csproj" />
<Project Path="bff/templates/src/BffBlazorAutoRenderMode/BffBlazorAutoRenderMode/BffBlazorAutoRenderMode.csproj" />
</Folder>
<Folder Name="/bff/test/">
<Project Path="bff/test/Bff.Tests/Bff.Tests.csproj" />
<Project Path="bff/test/Hosts.Tests/Hosts.Tests.csproj" />
</Folder>
<Folder Name="/bff/tools/">
<Project Path="bff/tools/PublicApi/PublicApi.csproj" />
</Folder>
<Folder Name="/conformance-report/" />
<Folder Name="/conformance-report/src/">
<Project Path="conformance-report/src/ConformanceReport/ConformanceReport.csproj" />