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.

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>

Uw privacy

We gebruiken cookies om uw ervaring op onze websites te verbeteren. Klik op de knop 'Alle cookies accepteren' om akkoord te gaan met het gebruik van cookies. Om niet-noodzakelijke cookies te weigeren, klikt u op 'Alleen noodzakelijke cookies'.

Bezoek onze privacyverklaring voor meer informatie