Auth
TsgcHTMLAuth: serverseitige Sitzungen, Anmeldestatus und CSRF-Schutz für eine sgcHTML-Anwendung, in Delphi, C++ Builder und .NET.
TsgcHTMLAuth: serverseitige Sitzungen, Anmeldestatus und CSRF-Schutz für eine sgcHTML-Anwendung, in Delphi, C++ Builder und .NET.
Eine nicht visuelle Komponente, die das Sitzungs-Cookie, den angemeldeten Benutzer und das CSRF-Token jeder Anfrage verwaltet. Weisen Sie einen Sitzungsspeicher zu, behandeln Sie OnAuthenticate, um das Passwort zu prüfen, setzen Sie die Eigenschaft Auth der HTMX-Engine und markieren Sie Routen mit RequireLogin. Sie ist Teil von sgcHTML, das unabhängig als eigenständiges Paket verkauft wird.
TsgcHTMLAuth mit TsgcHTMLSessionStore_Memory, TsgcHTMLSessionStore_File und TsgcHTMLSession (Units sgcHTML_Auth und sgcHTML_Session)
Kein Markup: Sitzungs-Cookies, CSRF-Token und Anmelde-Weiterleitungen
Delphi, C++ Builder, .NET
Weisen Sie einen Sitzungsspeicher zu, behandeln Sie OnAuthenticate, setzen Sie Auth an der Engine und markieren Sie die zu schützenden Routen. Ab dann liest die Engine die Sitzung jeder Anfrage, prüft das CSRF-Token und leitet anonyme Benutzer auf LoginPath um.
uses
sgcHTML_Session, sgcHTML_Auth, sgcHTMX_Router, sgcHTMX_Engine_Server;
// oHTMX is a TsgcHTMX_Engine_Server, oRouter is a TsgcHTMX_Router
var
oStore: TsgcHTMLSessionStore_Memory;
oAuth: TsgcHTMLAuth;
oRoute: TsgcHTMX_Route;
begin
oStore := TsgcHTMLSessionStore_Memory.Create(Self);
oStore.SweepInterval := 60;
oAuth := TsgcHTMLAuth.Create(Self);
oAuth.SessionStore := oStore;
oAuth.IdleTimeout := 1800; // seconds without a request
oAuth.AbsoluteTimeout := 43200; // seconds since sign-in
oAuth.LoginRateLimit.MaxAttempts := 5;
oAuth.OnAuthenticate := AuthAuthenticate;
oHTMX.Auth := oAuth;
// only a signed-in user reaches /orders
oRoute := oRouter.Routes.Add;
oRoute.Path := '/orders';
oRoute.RequireLogin := True;
oRoute.OnRoute := OrdersRoute;
// only a session with one of these roles reaches /admin
oRoute := oRouter.Routes.Add;
oRoute.Path := '/admin';
oRoute.RequireRoles := 'admin,manager';
oRoute.OnRoute := AdminRoute;
end;
procedure TForm1.AuthAuthenticate(Sender: TObject;
const aUser, aPassword: string; var aAccept: Boolean;
var aUserID, aDisplayName: string; const aRoles: TStrings);
begin
// LoadPasswordHash reads the value stored when the user was created
aAccept := sgcHTMLPasswordVerify(aPassword, LoadPasswordHash(aUser));
if aAccept then
begin
aUserID := aUser;
aDisplayName := aUser;
aRoles.Add('admin');
end;
end;
// when you create a user, store this hash, never the password
vHash := sgcHTMLPasswordHash('secret');
// includes: sgcHTML_Session.hpp, sgcHTML_Auth.hpp, sgcHTMX_Router.hpp, sgcHTMX_Engine_Server.hpp
// oHTMX is a TsgcHTMX_Engine_Server, oRouter is a TsgcHTMX_Router
TsgcHTMLSessionStore_Memory *oStore = new TsgcHTMLSessionStore_Memory(this);
oStore->SweepInterval = 60;
TsgcHTMLAuth *oAuth = new TsgcHTMLAuth(this);
oAuth->SessionStore = oStore;
oAuth->IdleTimeout = 1800; // seconds without a request
oAuth->AbsoluteTimeout = 43200; // seconds since sign-in
oAuth->LoginRateLimit->MaxAttempts = 5;
oAuth->OnAuthenticate = AuthAuthenticate;
oHTMX->Auth = oAuth;
// only a signed-in user reaches /orders
TsgcHTMX_Route *oRoute = oRouter->Routes->Add();
oRoute->Path = "/orders";
oRoute->RequireLogin = true;
oRoute->OnRoute = OrdersRoute;
// only a session with one of these roles reaches /admin
oRoute = oRouter->Routes->Add();
oRoute->Path = "/admin";
oRoute->RequireRoles = "admin,manager";
oRoute->OnRoute = AdminRoute;
void __fastcall TForm1::AuthAuthenticate(TObject *Sender,
const UnicodeString aUser, const UnicodeString aPassword, bool &aAccept,
UnicodeString &aUserID, UnicodeString &aDisplayName, TStrings *const aRoles)
{
// LoadPasswordHash reads the value stored when the user was created
aAccept = sgcHTMLPasswordVerify(aPassword, LoadPasswordHash(aUser));
if (aAccept)
{
aUserID = aUser;
aDisplayName = aUser;
aRoles->Add("admin");
}
}
// when you create a user, store this hash, never the password
String hash = sgcHTMLPasswordHash("secret");
using esegece.sgcWebSockets;
// htmx is a TsgcHTMX_Engine_Server, router is a TsgcHTMX_Router
var store = new TsgcHTMLSessionStore_Memory();
store.SweepInterval = 60;
var auth = new TsgcHTMLAuth();
auth.SessionStore = store;
auth.IdleTimeout = 1800; // seconds without a request
auth.AbsoluteTimeout = 43200; // seconds since sign-in
auth.LoginRateLimit.MaxAttempts = 5;
auth.OnAuthenticate += AuthAuthenticate;
htmx.Auth = auth;
// only a signed-in user reaches /orders
var route = router.Routes.Add();
route.Path = "/orders";
route.RequireLogin = true;
route.OnRoute += OrdersRoute;
// only a session with one of these roles reaches /admin
route = router.Routes.Add();
route.Path = "/admin";
route.RequireRoles = "admin,manager";
route.OnRoute += AdminRoute;
void AuthAuthenticate(object sender, string aUser, string aPassword,
ref bool aAccept, ref string aUserID, ref string aDisplayName,
List<string> aRoles)
{
// LoadPasswordHash reads the value stored when the user was created
aAccept = sgcHTMLAuthHelpers.sgcHTMLPasswordVerify(aPassword, LoadPasswordHash(aUser));
if (aAccept)
{
aUserID = aUser;
aDisplayName = aUser;
aRoles.Add("admin");
}
}
// when you create a user, store this hash, never the password
string hash = sgcHTMLAuthHelpers.sgcHTMLPasswordHash("secret");
Die Member, die Sie am häufigsten verwenden.
CookieName (Standard sgcsid), CookiePath und CookieDomain bestimmen das Cookie. CookieSecure und CookieHttpOnly sind standardmäßig True, und CookieSameSite ist hssLax. hssStrict und hssNone sind die anderen Werte, und hssNone fügt immer Secure hinzu.
IdleTimeout (1800 Sekunden) beendet eine Sitzung, die nicht benutzt wurde, AbsoluteTimeout (43200 Sekunden) beendet sie nach dieser Dauer seit der Anmeldung, egal wie aktiv sie war. 0 deaktiviert die jeweilige Prüfung. CurrentSession validiert beide und aktualisiert die Sitzung bei jeder Anfrage.
CSRFProtection ist standardmäßig aktiviert. Jede Sitzung erhält ein zufälliges Token: IssueCSRF(session) gibt es zurück, und ValidateCSRF(session, token) vergleicht es in konstanter Zeit. Die Engine liest das Token aus dem Header CSRFHeaderName (X-CSRF-Token) oder aus dem Feld CSRFFieldName (csrf_token) und antwortet mit 403 auf eine zustandsändernde Anfrage, der es fehlt.
Eine Seite, die für eine angemeldete Sitzung gerendert wird, enthält <meta name="csrf-token"> und <meta name="csrf-header"> in ihrem Head, und das mitgelieferte htmx-Skript sendet das Token in diesem Header bei jeder Anfrage, die nicht GET, HEAD oder OPTIONS ist. hx-post und hx-delete benötigen kein zusätzliches Markup.
RememberMeDays (0 bedeutet aus, höchstens 3650) schaltet es ein, und RememberCookieName benennt das Cookie (sgcrem). Hat eine Anfrage keine gültige Sitzung, aber ein gültiges Token, lädt OnLoadUser den Benutzer neu, es wird eine neue Sitzung ausgestellt und das Token rotiert. Der Speicher hält nur einen Hash des Verifiers.
LoginRateLimit ist ein TsgcHTMLAuthRateLimit_Options. Fehlgeschlagene Anmeldungen werden pro Client-IP und pro Benutzername innerhalb von WindowSeconds (300) gezählt. Wird MaxAttempts (5) erreicht, sind diese IP oder dieser Benutzer für LockoutSeconds (900) gesperrt, und OnAuthenticate wird während der Sperre nicht aufgerufen. MaxAttempts = 0 deaktiviert die Begrenzung, und IsLoginLocked(ip, user) meldet eine Sperre.
sgcHTMLPasswordHash(password, iterations) liefert pbkdf2-sha256$iterations$salt$hash mit einem zufälligen 16-Byte-Salt und standardmäßig 210000 Iterationen. sgcHTMLPasswordVerify(password, hash) prüft ein Passwort in konstanter Zeit und gibt bei einem fehlerhaft aufgebauten Hash False zurück.
TsgcHTMLSessionStore_Memory hält die Sitzungen im Prozess, mit SweepInterval für eine Bereinigung im Hintergrund. Halten Sie IdleTimeout und AbsoluteTimeout des Speichers gleich denen von Auth. TsgcHTMLSessionStore_File schreibt eine JSON-Datei pro Sitzung in Folder, sodass mehrere Prozesse ihn gemeinsam nutzen können, und schreibt eine Datei höchstens alle TouchInterval Sekunden (60) neu. Beide sind threadsicher.
TsgcHTMLSession enthält ID, UserID, DisplayName, Roles, freie Values (name=value), CSRFToken, CreatedAt, LastSeen, RemoteIP und UserAgentHash, dazu HasRole. Eine Route liest sie als TsgcHTMXRequest.Session, nil bei anonymen Anfragen. Speicher geben Kopien heraus, rufen Sie also SessionStore.Put auf, um eine Änderung zu übernehmen.
Authenticate wendet die Begrenzung an und löst OnAuthenticate aus. SignIn erzeugt immer eine neue Sitzungs-ID, löscht die alte und stellt ein neues CSRF-Token aus, was vor Session-Fixation schützt. SignOut beendet eine Sitzung, und SignOutEverywhere(userID) beendet jede Sitzung und jedes Angemeldet-bleiben-Token eines Benutzers. Außerhalb der Engine rufen Sie CurrentSession(cookieHeader, remoteIP, userAgent, setCookies) selbst auf, wie es die Demo Admin CRUD tut.
Markieren Sie eine TsgcHTMX_Route mit RequireLogin oder RequireRoles (durch Kommas getrennt, ein Treffer genügt). Eine anonyme Anfrage wird mit einem 302 auf LoginPath?next= umgeleitet, oder sie erhält 401 plus HX-Redirect, wenn htmx sie gesendet hat; eine Sitzung ohne die Rolle erhält 403. Die Engine beantwortet außerdem POST an LoginPath und LogoutPath und leitet danach zu AfterLoginPath weiter.
Eine Nachricht läuft mit der Sitzung der Cookies, die beim WebSocket-Handshake gesendet wurden, sofern dieser Handshake vom selben Origin stammt; jede andere Nachricht ist anonym, und eine abgelehnte Nachricht erhält keine Antwort. TsgcHTMX_Engine_Server.MessageSession(aConnection) gibt die Sitzung hinter einer Verbindung zurück, für einen Host, der OnHTMXMessage selbst beantwortet, und der Aufrufer gibt sie frei.
| Online-HilfeVollständige API-Referenz und Verwendungshandbuch für diese Komponente. | Öffnen | |
| Anleitung zu Sitzungen und AuthentifizierungCookies, CSRF, Routenschranken, Angemeldet bleiben und die Begrenzung der Anmeldeversuche, Schritt für Schritt. | Öffnen | |
| Alle sgcHTML-KomponentenDurchsuchen Sie die vollständige Funktionsmatrix von über 80 Komponenten. | Öffnen | |
| Kostenlose Testversion herunterladenDie 30-Tage-Testversion enthält die 60.HTML-Demoprojekte, darunter 02.AdminCRUD, das sich über TsgcHTMLAuth anmeldet. | Öffnen | |
| PreiseSingle-, Team- und Site-Lizenzen mit vollständigem Quellcode. | Öffnen |