Support
Posez vos questions sur Stack Overflow et taguez avec « itfoxtec-identity-blazor ».
Envoyez un e-mail à support@foxids.com avec un lien vers votre question.
Package
Versions
NuGet ITfoxtec Identity Blazor WebAssembly OpenID Connect
Code et licence
Code et exemple GitHub
Licence open-source
ITfoxtec Identity Blazor WebAssembly OpenID Connect
ITfoxtec Identity Blazor WebAssembly OpenID Connect est une bibliothèque OpenID Connect PKCE sans JavaScript pour Blazor WebAssembly.
Le nom de la société ITfoxtec a changé pour FoxIDs mais les composants conservent pour l’instant le nom ITfoxtec dans le nom du composant.
Versions .NET prises en charge :
- .NET 10.0
- .NET 9.0
- .NET 8.0
- .NET 7.0
- .NET 6.0
- .NET 5.0
La bibliothèque prend en charge la connexion et la déconnexion avec OpenID Connect en utilisant PKCE au lieu d’un secret client. Elle valide les jetons d’identité dans le navigateur à l’aide du document de découverte de l’OpenID Provider.
Le composant gère automatiquement les mises à jour de jetons et de sessions avec des refresh tokens lorsque le scope offline_access est spécifié.
Veuillez consulter l’ application d’exemple.
Vous pouvez utiliser l’ outil JWT pour décoder les jetons et créer des certificats auto-signés avec l’ outil de certificats.
Application d’exemple
Veuillez consulter l’ application d’exemple pour les détails d’implémentation.
L’application d’exemple est configurée pour s’authentifier avec foxids.com en utilisant l’utilisateur de test test1@foxids.com ou test2@foxids.com et le mot de passe TestAccess!
Pour plus d’informations sur les European Identity Services FoxIDs, veuillez consulter la documentation FoxIDs.
Installer
Installez le package NuGet ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect via le gestionnaire de packages Visual Studio.
Ou installez via PowerShell en utilisant la commande suivante.
Install-Package ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect
Ou via CLI.
dotnet add package ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect
Configuration et paramétrage
Enregistrez OpenidConnectPkce, HttpClient et IHttpClientFactory dans le fichier Program.cs.
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);
});
}
Ajoutez appsettings.json et éventuellement appsettings.Development.json sous wwwroot avec la configuration IdentitySettings. Le scope est ajouté comme une liste de valeurs séparées par des espaces.
{
"IdentitySettings": {
"Authority": "https://...some authority.../",
"ClientId": "...client id...",
"Scope": "...some scope..."
}
}
Ajoutez l’espace de noms de la bibliothèque @using ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect à Imports.razor.
Configuration IdP
Configurez le client Blazor comme client OpenID Connect sur l’IdP.
- Types de réponse : code
- Activer PKCE : true
- Callback de connexion : ...base URL.../authentication/login_callback
- Callback de déconnexion : ...base URL.../authentication/logout_callback
Appels API vers un autre domaine
La configuration peut être étendue pour prendre en charge des appels API vers des domaines autres que le domaine de base. Les AuthorizedUris de confiance dans la configuration IdentitySettings sont configurées sur 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);
});
}
Ajoutez des domaines de confiance comme AuthorizedUris dans la configuration IdentitySettings.
{
"IdentitySettings": {
"Authority": "https://...some authority.../",
"ClientId": "...client id...",
"Scope": "...some scope...",
"Resources": [ "...resource..." ],
"AuthorizedUris": [ "...authorized api Uri..." ]
}
}
Validation périodique du jeton d’accès
Définissez SessionValidationIntervalSeconds dans IdentitySettings (par défaut à 300 ; mettez à 0 pour désactiver).
Lorsque c’est activé, OidcAuthenticationStateProvider appelle périodiquement le point de terminaison UserInfo via OidcHelper.ValidateAccessTokenWithUserInfoEndpoint.
En cas d’échec de validation, le fournisseur efface la session et déclenche l’événement de déconnexion afin que l’UI invite l’utilisateur à se reconnecter.
Ajouter une page de callback
Ajoutez une page de callback Authentication.razor dans le dossier Pages avec le contenu suivant.
@page "/authentication/{action}"
@inherits AuthenticationPageBase
Vues d’autorisation
Mettez à jour App.razor pour inclure AuthorizeRouteView/NotAuthorized avec l’élément OidcRedirectToLogin. OidcRedirectToLogin démarre le flux de connexion si l’utilisateur n’a pas accès.
<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>
Ainsi, l’attribut Authorize et AuthorizeView sont tous deux pris en charge.
Menu connexion / déconnexion
Ajoutez LoginDisplay.razor avec un menu connexion / déconnexion contenant le contenu suivant.
@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 peut être ajouté à MainLayout.razor comme ceci.
@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>