Ich wollte eine Authentifizierung in Blazor WebAssembly, JWT, Net 8 einrichten, aber ich habe ein Problem gestoßen. Wenn ich Tags in eine interaktive Komponente platziere, wie hier: < /p>
@page "/"
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@inject IStringLocalizer Localizer
@using Microsoft.AspNetCore.Components.Authorization
Authorized
NotAuthorized
< /code>
Mein AuthentifizierungStateProvider funktioniert gut und gibt autorisiert oder nothorisiert zurück. Aber wenn ich versuche, es in mainlayout.razor zu tun, wie hier: < /p>
@using Microsoft.AspNetCore.Components.Authorization
@inherits LayoutComponentBase
Authorized
NotAuthorized
< /code>
Ich werde immer notauthorisiert. Dies geschieht, weil die Anwendung in mainlayout.razor nicht interaktiv gerendert wird. Wie kann ich das beheben?using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.JSInterop;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
namespace WMS.Client.Providers;
public class JwtAuthenticationStateProvider(ILocalStorageService LocalStorage, IJSRuntime JSRuntime) : AuthenticationStateProvider
{
private readonly ILocalStorageService _localStorage = LocalStorage;
private readonly IJSRuntime _JSRuntime = JSRuntime;
private const string TokenKey = "authToken";
public sealed override async Task GetAuthenticationStateAsync()
{
if (_JSRuntime is not IJSInProcessRuntime)
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
var token = await _localStorage.GetItemAsync(TokenKey);
if (string.IsNullOrEmpty(token))
return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
var user = new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(token), "jwt"));
return new AuthenticationState(user);
}
public async Task Login(string token)
{
await _localStorage.SetItemAsync(TokenKey, token);
var user = new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(token), "jwt"));
NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
}
public async Task Logout()
{
await _localStorage.RemoveItemAsync(TokenKey);
NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()))));
}
private static IEnumerable ParseClaimsFromJwt(string token)
{
var handler = new JwtSecurityTokenHandler();
var jwt = handler.ReadJwtToken(token);
return jwt.Claims;
}
}
< /code>
meine Routen.Razor: < /p>
@using Microsoft.AspNetCore.Components.Authorization
Sorry, there's nothing at this address.
< /code>
app.razor:
< /code>
program.cs in client Seite: < /p>
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using System.Globalization;
using WMS.Client.Providers;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
builder.Services.AddAuthorizationCore();
builder.Services.AddScoped();
builder.Services.AddScoped();
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US");
await builder.Build().RunAsync();
< /code>
Program.cs in der Serverseite: < /p>
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Authorization;
using WMS.Client.Providers;
using WMS.Components;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents();
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddAuthorization();
builder.Services.AddScoped();
builder.Services.AddScoped();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseWebAssemblyDebugging();
}
else
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
}
app.UseStaticFiles();
app.UseAntiforgery();
app.MapRazorComponents()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(WMS.Client._Imports).Assembly);
app.Run();
Ich wollte eine Authentifizierung in Blazor WebAssembly, JWT, Net 8 einrichten, aber ich habe ein [url=viewtopic.php?t=18916]Problem[/url] gestoßen. Wenn ich Tags in eine interaktive Komponente platziere, wie hier: < /p> [code]@page "/" @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) @inject IStringLocalizer Localizer @using Microsoft.AspNetCore.Components.Authorization
Authorized
NotAuthorized
< /code> Mein AuthentifizierungStateProvider funktioniert gut und gibt autorisiert oder nothorisiert zurück. Aber wenn ich versuche, es in mainlayout.razor zu tun, wie hier: < /p> @using Microsoft.AspNetCore.Components.Authorization @inherits LayoutComponentBase
Authorized
NotAuthorized
< /code> Ich werde immer notauthorisiert. Dies geschieht, weil die Anwendung in mainlayout.razor nicht interaktiv gerendert wird. Wie kann ich das beheben?using Blazored.LocalStorage; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.JSInterop; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims;
public sealed override async Task GetAuthenticationStateAsync() { if (_JSRuntime is not IJSInProcessRuntime) return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
var token = await _localStorage.GetItemAsync(TokenKey);
if (string.IsNullOrEmpty(token)) return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
var user = new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(token), "jwt")); return new AuthenticationState(user); }
public async Task Login(string token) { await _localStorage.SetItemAsync(TokenKey, token);
var user = new ClaimsPrincipal(new ClaimsIdentity(ParseClaimsFromJwt(token), "jwt")); NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user))); }
< /code> program.cs in client Seite: < /p> using Blazored.LocalStorage; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using System.Globalization; using WMS.Client.Providers;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US"); CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US");
await builder.Build().RunAsync(); < /code> Program.cs in der Serverseite: < /p> using Blazored.LocalStorage; using Microsoft.AspNetCore.Components.Authorization; using WMS.Client.Providers; using WMS.Components;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveWebAssemblyComponents();
Ich wollte eine Authentifizierung in Blazor WebAssembly, JWT, Net 8 einrichten, aber ich habe ein Problem gestoßen. Wenn ich Tags in eine interaktive Komponente platziere, wie hier:
@page /...
Ich habe eine Blazor -Web -Assembly -App. Ich versuche, den Benutzer entweder mit seinen Azure -AD -Anmeldeinformationen oder mit seinen in einer Datenbank gespeicherten Anmeldeinformationen...
Ich habe eine Blazor WebAssembly-Anwendung für .NET 8. Ich verwende die OIDC-Authentifizierung und habe die Integration mit Keycloak erfolgreich durchgeführt. Meine aktuelle Konfiguration sieht so...