Ich habe eine Blazor -Serverside -Anwendung, in der ich Authentifizierung hinzufüge. Postauthentifizierung, überprüfen Sie, ob sich der Benutzer in der Datenbank befindet.
Wenn dies nicht der Fall ist, möchte ich sie hinzufügen. AuthenticationStateProvider < /code> einige Ansprüche aus der Datenbank anhängen. /> In meinen Compenetns ziehe ich das AuthenticationState über einen CascadingParameter
zurück.
[CascadingParameter]
public Task? AuthState { get; set; }
Das Problem ist, dass bei der Auslösung der Anmeldung von einem Authentifizierungshandler das _initialValueFactory in CascadingValuesource mit dem neuen authentcitaionstate überschreiben. aufgerufen. folgenden Code, um meine Authentifizierung hinzuzufügen < /p>
program.cs
Ich habe eine Blazor -Serverside -Anwendung, in der ich Authentifizierung hinzufüge. Postauthentifizierung, überprüfen Sie, ob sich der Benutzer in der Datenbank befindet.
Wenn dies nicht der Fall ist, möchte ich sie hinzufügen. AuthenticationStateProvider < /code> einige Ansprüche aus der Datenbank anhängen. /> In meinen Compenetns ziehe ich das AuthenticationState über einen CascadingParameter zurück.[code][CascadingParameter] public Task? AuthState { get; set; } [/code] Das [url=viewtopic.php?t=20324]Problem[/url] ist, dass bei der Auslösung der Anmeldung von einem Authentifizierungshandler das _initialValueFactory in CascadingValuesource mit dem neuen authentcitaionstate überschreiben. aufgerufen. folgenden Code, um meine Authentifizierung hinzuzufügen < /p> program.cs [code]internal async Task CreateApplication() { var builder = WebApplication.CreateBuilder(args); // ... Some code to set fields
public class DummyAuthenticationOptions : AuthenticationSchemeOptions;
public class DummyAuthenticationHandler( IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder ) : AuthenticationHandler(options, logger, encoder), IAuthenticationSignOutHandler {
protected override async Task HandleAuthenticateAsync() { await Task.CompletedTask; var cookie = Request.Cookies.FirstOrDefault(c => c.Key == nameof(DummyAuthenticationHandler)); if (cookie.Value is null) { return AuthenticateResult.NoResult(); }
var cookieValue = DecodeFromBase64(cookie.Value); var claims = JsonSerializer.Deserialize(cookieValue);
var claimsIdentity = new ClaimsIdentity(claims!.Select(c => new Claim(c.Key, c.Value)), Scheme.Name); var ticket = new AuthenticationTicket(new ClaimsPrincipal(claimsIdentity), Scheme.Name);
if (properties.RedirectUri is not null) { Response.Redirect(properties.RedirectUri); }
return Task.CompletedTask; }
public Task SignOutAsync(AuthenticationProperties? properties) { Response.Cookies.Delete(nameof(DummyAuthenticationHandler)); if (properties?.RedirectUri is not null) { Response.Redirect(properties.RedirectUri); } return Task.CompletedTask; }
< /code> CustomAuthenticationStateProvider < /H3> public class CustomAuthenticationStateProvider( IDbContextFactory dbFactory ) : ServerAuthenticationStateProvider { public override async Task GetAuthenticationStateAsync() { var authState = await base.GetAuthenticationStateAsync(); var claimsUser = authState.User;
// Get your custom data - in this case some roles var dbUser = await UpsertUser(claimsUser);
// add some new identities to the Claims Principal claimsUser.AddIdentity(new ClaimsIdentity([ new Claim("user_id", dbUser.UserId.ToString()), ]));
// return the modified principal return new AuthenticationState(claimsUser); }
private async Task UpsertUser(ClaimsPrincipal claimUser) { var subjectId = claimUser.Claims.FirstOrDefault(c => c.Type == OAuthClaim.SubjectId)?.Value; if (string.IsNullOrEmpty(subjectId)) { throw new ArgumentException("Subject ID is missing from claims"); }
// Get the user from the database await using var dbContext = await dbFactory.CreateDbContextAsync(); var user = await dbContext.Users .AsNoTracking() .FirstOrDefaultAsync(u => u.SubjectId == subjectId);
if (user == null) { user = new User { SubjectId = subjectId, FirstName = claimUser.FindFirstValue(OAuthClaim.GivenName) ?? "Unknown", LastName = claimUser.FindFirstValue(OAuthClaim.FamilyName) ?? "Unknown", Email = claimUser.FindFirstValue(OAuthClaim.Email) ?? "Unknown", }; dbContext.Users.Add(user); await dbContext.SaveChangesAsync(); dbContext.Entry(user).State = EntityState.Detached; }
Ich versuche, über sein Bearer-Token in ASP.NET Core auf die Ansprüche eines Benutzers zuzugreifen, aber im Handler ist HttpContext.User.Identity.Name immer null, und die Claims-Auflistung ist es...
Ich versuche, über sein Bearer-Token in ASP.NET Core auf die Ansprüche eines Benutzers zuzugreifen, aber im Handler ist HttpContext.User.Identity.Name immer null, und die Claims-Auflistung ist es...
Wenn ich mich bei Google anmelde und den PHP von Google API -Client verwendet habe, tausche ich einen Code aus und erhalte Token und User_id. Ich speichere das Token und User_id für diesen Benutzer....
Gibt es eine Möglichkeit, eine zusätzliche Eigenschaft für den Benutzer zu erstellen. Identität, die keine Ansprüche verwendet? Ich habe die Lösung gesehen, die Ansprüche verwendet und sie getestet...