Abrufen des Benutzernamens des angemeldeten Benutzers mit Negotiate-/Windows-DomänenanmeldeinformationenHTML

HTML-Programmierer
Guest
 Abrufen des Benutzernamens des angemeldeten Benutzers mit Negotiate-/Windows-Domänenanmeldeinformationen

Post by Guest »

Was ich für eine sehr einfache Aufgabe gehalten habe, hat sich als das Gegenteil davon herausgestellt.
Ich erstelle eine ziemlich einfache Web-App mit Blazor und habe Windows Die auf Domänenanmeldeinformationen basierende Authentifizierung funktioniert einwandfrei mit Negotiate. Das war ziemlich einfach einzurichten.
Nehmen wir nun an, ich möchte eine Nachricht vom Typ „Willkommen:“ auf einem Banner anzeigen oder den Benutzernamen einfügen, um den Überblick über Formulareinsendungen zu behalten. Jede Lösung, auf die ich gestoßen bin, scheint darauf hinzudeuten, so etwas direkt in der Komponente zu tun, in der ich auf den Benutzernamen zugreifen muss.
Normalerweise würde ich einfach die eingegebene Benutzernamenzeichenfolge speichern das Feld „Benutzername“, aber da Negotiate dieses Browser-Popup-Fenster für Anmeldungen anstelle einer Webseite verwendet, halte ich das nicht für möglich. (Vielleicht irre ich mich?)
Das ist nicht mein exakter Code, aber im Grunde ist es das, was ich versuche.
Das funktioniert in MainLayout.razor, aber in jedem anderen Die darin enthaltene Komponente löst eine Nullwertausnahme aus.

Code: Select all

@page "/"
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Authorization
@inject AuthenticationStateProvider AuthStateProvider
@attribute [Authorize]

 Welcome Back: @username 

@code{
public string? username;
protected override async OnInitializedAsync(){
var authstate = await AuthStateProvider.GetAuthenticationStateAsync();
username = authstate.User.Identity.Name.Substring(9);
}
}
Ich denke, das Problem könnte darin liegen, dass die Razor-Komponenten zweimal gerendert werden, was dazu führt, dass die Authstate-Variable zweimal aufgerufen wird, was zu den Antiforgery-Fehlern führt, die ich immer wieder bekomme.
Ich denke wirklich, dass der Schlüssel hier irgendwie darin besteht, meine Komponenten dazu zu zwingen, nur einmal zu rendern.
Auf diese Weise muss ich nur den Authentifizierungsstatus zum Zeitpunkt der Anmeldung abrufen und nur das zwischenspeichern, was ich davon benötige Ich kann in allen meinen Komponenten darauf zugreifen, ohne dass dies verursacht wird Fehler.
Leistung ist für mich bei diesem Projekt überhaupt kein Problem. Es handelt sich um eine sehr leichte Anwendung, die nur einer sehr kleinen Anzahl von Benutzern dient, daher bin ich bereit, etwas Leistung zu opfern, damit dies funktioniert.
Bei all der Zeit, die ich damit verbracht habe, habe ich Ich hätte wahrscheinlich mein eigenes traditionelles Authentifizierungssystem und meine eigene Anmeldekomponente erstellen und meiner Datenbank eine Benutzertabelle hinzufügen können.
Aber ich wollte etwas, das für Benutzer optimierter ist (würde irgendwann auf ein SSO-Modell umsteigen), und das ist an diesem Punkt der Fall , ich habe das Gefühl, auch dabei zu sein tief.
Ich habe das Gefühl, dass das wahrscheinlich viel einfacher ist, als ich es mache. Ich ging davon aus, dass Negotie über einige integrierte Methoden oder Eigenschaften verfügen würde, mit denen der Benutzername abgerufen werden könnte, ohne dass mein Projekt abstürzt, aber ich glaube nicht, dass dies der Fall ist.
Ich habe ein paar Spiele mit Unity und C# gemacht. und ein paar Websites mit Flask und JS, aber das ist mein erstes echtes Blazor-Projekt und ich habe mich durch das meiste davon zurechtgefunden, aber das hat mich völlig blockiert.
Alles Hilfe wird hier sehr geschätzt.
Projektdetails
  • Dotnet 8.0
  • Standard-Blazor-Vorlage
    < li>InteractiveServer-Rendermodus
Ich habe dafür verschiedene Lösungen ausprobiert, aber keine davon funktioniert.
Die Das erste, was ich ausprobiert habe, war das einfachste, nämlich einfach GetAuthenticationStateAsync() aufzurufen Konstruktormethode der Razor-Komponente, in der ich den Benutzernamen benötige. Offensichtlich funktioniert das aufgrund des doppelten Renderproblems nicht.
Das nächste, was ich versuchte, war, meinen Router in „routes.razor“ zu platzieren was mein Projekt irreparabel vermasselt hat und mich gezwungen hat, es aus dem Backup wiederherzustellen. So habe ich gelernt, dass ich mir überhaupt alles ansehen muss, was das Wort „Route“ enthält. Stattdessen habe ich versucht, mein MainLayout.razor im Block zu kapseln, und obwohl das mein Projekt nicht zerstört hat, funktioniert es immer noch nicht. Das Gleiche gilt, wenn ich versuche, einfach nur den Benutzernamen von MainLayout.razor mit einer . Ich habe herausgefunden, dass dies nicht funktioniert, weil die Razor-Komponenten gerne zweimal rendern. Der Grund, warum ich das weiß, ist, dass ich eine Console.Writeline()-Anweisung in OnInitializedAsync() eingefügt habe, die den Benutzernamen an die Debug-Konsole ausgeben soll. Wenn ich die Seite lade, erhalte ich nicht nur eine, sondern ZWEI Druckanweisungen, und nur die erste enthält den Benutzernamen. Das bedeutet, dass das Cascading-Parameter-Ding den Wert nur beim ersten Rendern übergibt.
Jetzt würde ich GERNE den Rendermodus ändern, aber InteractiveServer ist das Einzige, was ich nach @rendermode einfügen kann< /p>
Ich habe darüber nachgedacht, einen bereichsbezogenen Dienst hinzuzufügen, der den Benutzernamen als statische Zeichenfolge speichert, aber nur den Benutzernamen des zuletzt angemeldeten Benutzers enthält.
Gemini hat vorgeschlagen, einen Statuscontainer zu erstellen, der jedes Mal eine Benutzernamensvariable aktualisiert Es tritt ein Zustandsänderungsereignis auf, aber ich mache mir immer noch Sorgen, dass es zum gleichen Ergebnis führen wird wie der bereichsbezogene Dienst, den ich bereits ausprobiert habe.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post