Supporto
Fai domande su Stack Overflow e usa il tag 'itfoxtec-identity-blazor'.
Email support@foxids.com con un link alla tua domanda.
Pacchetto
Rilasci
NuGet ITfoxtec Identity Blazor WebAssembly OpenID Connect
Codice e licenza
Codice GitHub e sample
Licenza open source
ITfoxtec Identity Blazor WebAssembly OpenID Connect
ITfoxtec Identity Blazor WebAssembly OpenID Connect è una libreria OpenID Connect PKCE senza JavaScript per Blazor WebAssembly.
Il nome dell'azienda ITfoxtec è cambiato in FoxIDs ma i componenti manterranno per ora il nome ITfoxtec come parte del nome del componente.
Versioni .NET supportate:
- .NET 10.0
- .NET 9.0
- .NET 8.0
- .NET 7.0
- .NET 6.0
- .NET 5.0
La libreria supporta login e logout con OpenID Connect usando PKCE invece di un client secret. Valida i token ID nel browser usando il documento di discovery dell'OpenID Provider.
Il componente gestisce automaticamente gli aggiornamenti di token e sessione con refresh token quando è specificato lo scope offline_access.
Consulta la applicazione di esempio.
Puoi usare lo strumento JWT per decodificare i token e creare certificati auto firmati con lo strumento certificati.
Applicazione di esempio
Consulta la applicazione di esempio per i dettagli di implementazione.
L'applicazione di esempio è configurata per autenticare con foxids.com usando l'utente di test test1@foxids.com o test2@foxids.com e password TestAccess!
Per maggiori informazioni sui servizi di identità europei FoxIDs, vedi la documentazione FoxIDs.
Installazione
Installa il pacchetto NuGet ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect tramite il gestore pacchetti di Visual Studio.
Oppure installa via PowerShell usando il comando seguente.
Install-Package ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect
Oppure tramite CLI.
dotnet add package ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect
Configurazione e setup
Registra OpenidConnectPkce, HttpClient e IHttpClientFactory nel file 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);
});
}
Aggiungi appsettings.json e gli eventuali appsettings.Development.json sotto wwwroot con la configurazione IdentitySettings. Lo scope è aggiunto come elenco di valori separati da spazi.
{
"IdentitySettings": {
"Authority": "https://...some authority.../",
"ClientId": "...client id...",
"Scope": "...some scope..."
}
}
Aggiungi lo spazio dei nomi della libreria @using ITfoxtec.Identity.BlazorWebAssembly.OpenidConnect a Imports.razor.
Configurazione IdP
Configura il client Blazor come client OpenID Connect sull'IdP.
- Response types: code
- Enable PKCE: true
- Callback login: ...base URL.../authentication/login_callback
- Callback logout: ...base URL.../authentication/logout_callback
Chiamate API verso un altro dominio
La configurazione può essere estesa per supportare chiamate API verso domini diversi dal dominio base. Gli AuthorizedUris attendibili nella configurazione IdentitySettings sono configurati su 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);
});
}
Aggiungi domini attendibili come AuthorizedUris nella configurazione IdentitySettings.
{
"IdentitySettings": {
"Authority": "https://...some authority.../",
"ClientId": "...client id...",
"Scope": "...some scope...",
"Resources": [ "...resource..." ],
"AuthorizedUris": [ "...authorized api Uri..." ]
}
}
Validazione periodica del token di accesso
Imposta SessionValidationIntervalSeconds in IdentitySettings (predefinito 300; imposta 0 per disabilitare).
Quando abilitato, OidcAuthenticationStateProvider chiama periodicamente l'endpoint UserInfo tramite OidcHelper.ValidateAccessTokenWithUserInfoEndpoint.
Se la validazione fallisce, il provider cancella la sessione e genera l'evento di logout così la UI può chiedere all'utente di accedere di nuovo.
Aggiungi pagina di callback
Aggiungi una pagina di callback Authentication.razor nella cartella Pages con il seguente contenuto.
@page "/authentication/{action}"
@inherits AuthenticationPageBase
Autorizza le view
Aggiorna App.razor per includere AuthorizeRouteView/NotAuthorized con l'elemento OidcRedirectToLogin. OidcRedirectToLogin avvia il flusso di login se l'utente non ha accesso.
<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>
In questo modo sono supportati sia l'attributo Authorize sia AuthorizeView.
Menu login/logout
Aggiungi LoginDisplay.razor con un menu di login/logout con il seguente contenuto.
@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 può essere aggiunto a MainLayout.razor così.
@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>