Support
Stel vragen op Stack Overflow en tag met 'itfoxtec-identity-blazor'.
Stuur een e-mail naar support@foxids.com met een link naar je vraag.
Pakket
Releases
NuGet ITfoxtec Identity Blazor WebAssembly OpenID Connect
Code en licentie
GitHub code en sample
Open-source licentie
ITfoxtec Identity Blazor WebAssembly OpenID Connect
ITfoxtec Identity Blazor WebAssembly OpenID Connect is een JavaScript vrije OpenID Connect PKCE bibliotheek voor Blazor WebAssembly.
De bedrijfsnaam ITfoxtec is gewijzigd in FoxIDs maar de componenten behouden voorlopig de ITfoxtec naam als onderdeel van de componentnaam.
Ondersteunde .NET versies:
- .NET 10.0
- .NET 9.0
- .NET 8.0
- .NET 7.0
- .NET 6.0
- .NET 5.0
De bibliotheek ondersteunt login en logout met OpenID Connect met PKCE in plaats van een client secret. Het valideert ID tokens in de browser met het OpenID Provider discovery document.
De component verwerkt automatisch token en session updates met refresh tokens wanneer de offline_access scope is opgegeven.
Zie de sample application.
Je kunt de JWT tool gebruiken om tokens te decoderen en zelfondertekende certificaten te maken met de certificaattool.
Sample application
Zie de sample application voor implementatiedetails.
De sample applicatie is geconfigureerd om te authenticeren met foxids.com met testgebruiker test1@foxids.com of test2@foxids.com en wachtwoord TestAccess!
Voor meer informatie over de European Identity Services FoxIDs, zie de FoxIDs documentatie.
Installeren
Installeer het ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect NuGet pakket via de Visual Studio package manager.
Of installeer via PowerShell met het volgende commando.
Install-Package ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect
Of via CLI.
dotnet add package ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect
Setup en configuratie
Registreer OpenidConnectPkce, HttpClient en IHttpClientFactory in het Program.cs bestand.
private static void ConfigureServices(IServiceCollection services, WebAssemblyHostConfiguration configuration, IWebAssemblyHostEnvironment hostEnvironment)
{
services.AddHttpClient("BlazorWebAssemblyOidcSample.API", client => client.BaseAddress = new Uri(hostEnvironment.BaseAddress))
.AddHttpMessageHandler<AccessTokenMessageHandler>();
services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("BlazorWebAssemblyOidcSample.API"));
services.AddOpenidConnectPkce(settings =>
{
configuration.Bind("IdentitySettings", settings);
});
}
Voeg appsettings.json en eventuele appsettings.Development.json configuratiebestanden toe onder wwwroot met de IdentitySettings configuratie. De scope wordt toegevoegd als een spatie gescheiden lijst van waarden.
{
"IdentitySettings": {
"Authority": "https://...some authority.../",
"ClientId": "...client id...",
"Scope": "...some scope..."
}
}
Voeg de bibliotheek namespace @using ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect toe aan Imports.razor.
IdP configuratie
Configureer de Blazor client als een OpenID Connect client op de IdP.
- Response types: code
- PKCE inschakelen: true
- Login call back: ...base URL.../authentication/login_callback
- Logout call back: ...base URL.../authentication/logout_callback
API calls naar een ander domein
De configuratie kan worden uitgebreid om API calls naar andere domeinen dan het basisdomein te ondersteunen. De vertrouwde AuthorizedUris in de IdentitySettings configuratie worden geconfigureerd op de AccessTokenMessageHandler.
private static void ConfigureServices(IServiceCollection services, WebAssemblyHostConfiguration configuration, IWebAssemblyHostEnvironment hostEnvironment)
{
services.AddHttpClient("BlazorWebAssemblyOidcSample.API", client => client.BaseAddress = new Uri(hostEnvironment.BaseAddress))
.AddHttpMessageHandler(sp =>
{
var handler = sp.GetService<AccessTokenMessageHandler>();
configuration.Bind("IdentitySettings", handler);
return handler;
});
services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("BlazorWebAssemblyOidcSample.API"));
services.AddOpenidConnectPkce(settings =>
{
configuration.Bind("IdentitySettings", settings);
});
}
Voeg vertrouwde domeinen toe als AuthorizedUris in de IdentitySettings configuratie.
{
"IdentitySettings": {
"Authority": "https://...some authority.../",
"ClientId": "...client id...",
"Scope": "...some scope...",
"Resources": [ "...resource..." ],
"AuthorizedUris": [ "...authorized api Uri..." ]
}
}
Periodieke access token validatie
Stel SessionValidationIntervalSeconds in IdentitySettings (standaard is 300; zet op 0 om uit te schakelen).
Wanneer ingeschakeld, OidcAuthenticationStateProvider roept periodiek het UserInfo endpoint aan via OidcHelper.ValidateAccessTokenWithUserInfoEndpoint.
Als validatie faalt, wist de provider de session en activeert de logout gebeurtenis zodat de UI de gebruiker kan vragen opnieuw in te loggen.
Call back pagina toevoegen
Voeg een Authentication.razor call back pagina toe in de Pages map met de volgende inhoud.
@page "/authentication/{action}"
@inherits AuthenticationPageBase
Authorize views
Werk App.razor bij om AuthorizeRouteView/NotAuthorized op te nemen met het OidcRedirectToLogin element. OidcRedirectToLogin start de login flow als de gebruiker geen toegang heeft.
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<OidcRedirectToLogin />
</NotAuthorized>
<Authorizing>
<h1>Authentication in progress</h1>
<p>Only visible while authentication is in progress.</p>
</Authorizing>
</AuthorizeRouteView>
</Found>
<NotFound>
<CascadingAuthenticationState>
<LayoutView Layout="@typeof(MainLayout)">
<h1>Sorry</h1>
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</CascadingAuthenticationState>
</NotFound>
</Router>
Daarmee worden zowel het Authorize attribuut als AuthorizeView ondersteund.
Login / logout menu
Voeg LoginDisplay.razor toe met een login / logout menu met de volgende inhoud.
@inject OpenidConnectPkce oenidConnectPkce
<AuthorizeView>
<Authorized>
Hello, @context.User.Identity.Name!
<button class="nav-link btn btn-link" @onclick="LogoutAsync">Logout</button>
</Authorized>
<NotAuthorized>
<button class="nav-link btn btn-link" @onclick="LoginAsync">Login</button>
</NotAuthorized>
</AuthorizeView>
@code{
private async Task LoginAsync(MouseEventArgs args)
{
await oenidConnectPkce.LoginAsync();
}
private async Task LogoutAsync(MouseEventArgs args)
{
await oenidConnectPkce.LogoutAsync();
}
}
LoginDisplay kan aan MainLayout.razor worden toegevoegd zoals dit.
@inherits LayoutComponentBase
<div class="sidebar">
<NavMenu />
</div>
<div class="main">
<div class="top-row px-4">
<LoginDisplay />
</div>
<div class="content px-4">
@Body
</div>
</div>