Auth
TsgcHTMLAuth: server-side sessies, inlogstatus en CSRF-beveiliging voor een sgcHTML-applicatie, in Delphi, C++ Builder en .NET.
TsgcHTMLAuth: server-side sessies, inlogstatus en CSRF-beveiliging voor een sgcHTML-applicatie, in Delphi, C++ Builder en .NET.
Een niet-visueel component dat de sessiecookie, de ingelogde gebruiker en het CSRF-token van elk verzoek beheert. Wijs een sessieopslag toe, handel OnAuthenticate af om het wachtwoord te controleren, stel de eigenschap Auth van de HTMX-engine in en markeer routes met RequireLogin. Het maakt deel uit van sgcHTML, dat onafhankelijk wordt verkocht als zelfstandig pack.
TsgcHTMLAuth met TsgcHTMLSessionStore_Memory, TsgcHTMLSessionStore_File en TsgcHTMLSession (units sgcHTML_Auth en sgcHTML_Session)
Geen markup: sessiecookies, CSRF-tokens en doorverwijzingen naar de login
Delphi, C++ Builder, .NET
Wijs een sessieopslag toe, handel OnAuthenticate af, stel Auth in op de engine en markeer de routes die beveiligd moeten worden. Vanaf dan leest de engine de sessie van elk verzoek, controleert het CSRF-token en stuurt anonieme gebruikers door naar LoginPath.
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");
De members die je het vaakst gebruikt.
CookieName (standaard sgcsid), CookiePath en CookieDomain bepalen de vorm van de cookie. CookieSecure en CookieHttpOnly zijn standaard True en CookieSameSite is hssLax; hssStrict en hssNone zijn de andere waarden, en hssNone voegt altijd Secure toe.
IdleTimeout (1800 seconden) beëindigt een sessie die niet is gebruikt, AbsoluteTimeout (43200 seconden) beëindigt een sessie zo lang na het inloggen, wat de activiteit ook is. 0 schakelt beide controles uit. CurrentSession valideert beide en werkt de sessie bij elk verzoek bij.
CSRFProtection staat standaard aan. Elke sessie krijgt een willekeurig token: IssueCSRF(session) geeft het terug en ValidateCSRF(session, token) vergelijkt het in constante tijd. De engine leest het token uit de header CSRFHeaderName (X-CSRF-Token) of het veld CSRFFieldName (csrf_token) en antwoordt met 403 op een verzoek dat de status wijzigt en het niet bevat.
Een pagina die voor een ingelogde sessie is gerenderd, bevat <meta name="csrf-token"> en <meta name="csrf-header"> in de head, en het meegeleverde htmx-script stuurt het token in die header mee bij elk verzoek dat geen GET, HEAD of OPTIONS is. hx-post en hx-delete hebben geen extra markup nodig.
RememberMeDays (0 betekent uit, maximaal 3650) schakelt het in en RememberCookieName geeft de cookie zijn naam (sgcrem). Als een verzoek geen geldige sessie maar wel een geldig token heeft, laadt OnLoadUser de gebruiker opnieuw, wordt een nieuwe sessie uitgegeven en wordt het token geroteerd. De opslag bewaart alleen een hash van de verifier.
LoginRateLimit is een TsgcHTMLAuthRateLimit_Options. Mislukte inlogpogingen worden geteld per client-IP en per gebruikersnaam binnen WindowSeconds (300); wanneer MaxAttempts (5) wordt bereikt, wordt dat IP of die gebruiker geblokkeerd voor LockoutSeconds (900), en OnAuthenticate wordt niet aangeroepen zolang de blokkade duurt. MaxAttempts = 0 schakelt de limiet uit en IsLoginLocked(ip, user) meldt een blokkade.
sgcHTMLPasswordHash(password, iterations) geeft pbkdf2-sha256$iterations$salt$hash terug met een willekeurige salt van 16 byte en standaard 210000 iteraties. sgcHTMLPasswordVerify(password, hash) controleert een wachtwoord in constante tijd en geeft False terug voor een hash met een ongeldig formaat.
TsgcHTMLSessionStore_Memory bewaart sessies in het proces, met SweepInterval voor een opruimronde op de achtergrond; houd de IdleTimeout en AbsoluteTimeout ervan gelijk aan die van de Auth. TsgcHTMLSessionStore_File schrijft één JSON-bestand per sessie naar Folder, zodat meerdere processen het kunnen delen, en herschrijft een bestand hoogstens elke TouchInterval seconden (60). Beide zijn thread-safe.
TsgcHTMLSession bevat ID, UserID, DisplayName, Roles, vrije Values (naam=waarde), CSRFToken, CreatedAt, LastSeen, RemoteIP en UserAgentHash, plus HasRole. Een route leest de sessie als TsgcHTMXRequest.Session, nil wanneer anoniem. Opslagen geven kopieën uit, dus roep SessionStore.Put aan om een wijziging te bewaren.
Authenticate past de limiet op inlogpogingen toe en roept OnAuthenticate aan. SignIn maakt altijd een nieuw sessie-id aan, verwijdert het oude en geeft een nieuw CSRF-token uit, wat beschermt tegen session fixation. SignOut beëindigt één sessie en SignOutEverywhere(userID) beëindigt elke sessie en elk onthoud-mij-token van een gebruiker. Roep buiten de engine zelf CurrentSession(cookieHeader, remoteIP, userAgent, setCookies) aan, zoals de Admin CRUD-demo doet.
Markeer een TsgcHTMX_Route met RequireLogin of RequireRoles (kommagescheiden, één overeenkomst is genoeg). Een anoniem verzoek wordt met een 302 doorgestuurd naar LoginPath?next=, of krijgt 401 plus HX-Redirect wanneer htmx het verstuurde; een sessie zonder de rol krijgt 403. De engine beantwoordt ook POST naar LoginPath en LogoutPath en gaat daarna naar AfterLoginPath.
Een bericht draait met de sessie van de cookies die bij de WebSocket-handshake zijn meegestuurd, mits die handshake van dezelfde origin kwam; elk ander bericht is anoniem, en een geweigerd bericht krijgt geen antwoord. TsgcHTMX_Engine_Server.MessageSession(aConnection) geeft de sessie achter een verbinding terug voor een host die OnHTMXMessage zelf beantwoordt, en de aanroeper geeft die vrij.
| Online helpVolledige API-referentie en gebruikshandleiding voor dit onderdeel. | Openen | |
| Handleiding voor sessies en authenticatieCookies, CSRF, routebeveiliging, onthoud-mij en de limiet op inlogpogingen, stap voor stap. | Openen | |
| Alle sgcHTML-componentenBlader door de volledige functiematrix van 80+ componenten. | Openen | |
| Download gratis proefversieDe proefversie van 30 dagen bevat de 60.HTML-demoprojecten, waaronder 02.AdminCRUD, dat inlogt via TsgcHTMLAuth. | Openen | |
| PrijzenSingle-, Team- en Site-licenties met volledige broncode. | Openen |