Aşağıda özel uç noktaları, challenge politikalarını, veritabanı destekli kimlik bilgisi depolamayı, FIDO Metadata doğrulamasını ve kaynaklar arası iframe desteğini gösteren daha kapsamlı bir Delphi örneği bulunmaktadır. Kod, güvenlik politikalarını uygulamak için gelişmiş olay işlemeyi öne çıkarır.
sgcWebSockets WebAuthn Sunucu Örneği
procedure TForm1.ConfigureWebAuthn;
begin
// Component setup
FWebAuthn := TsgcWSServer_API_WebAuthn.Create(nil);
FWebAuthn.Server := FHTTPServer;
FWebAuthn.Enabled := True;
// Endpoint remapping
FWebAuthn.EndpointsOptions.AuthenticationOptions.Endpoint := '/auth/options';
FWebAuthn.EndpointsOptions.AuthenticationVerify.Endpoint := '/auth/verify';
FWebAuthn.EndpointsOptions.RegistrationOptions.Endpoint := '/reg/options';
FWebAuthn.EndpointsOptions.RegistrationVerify.Endpoint := '/reg/verify';
// Relying-party definition
with FWebAuthn.WebAuthnOptions do
begin
RelyingParty := 'secure.example.com';
Origins.Origins.Text := 'https://app.example.com'#13#10'https://login.example.net';
Origins.TopOrigins.Text := 'https://host.example.org';
Origins.AllowCrossOrigins := True;
// Cryptographic & UX policies
Algorithms := [waunalgES256, waunalgRS256];
DefaultOptions.Registration.UserVerification := waunuvPreferred;
DefaultOptions.Registration.Attestation := waunaDirect;
Timeout := 60000;
// Challenge: 32 CSPRNG-random bytes, hex-encoded, generated internally by
// the server; not configurable. Override Response.Challenge instead, in
// OnWebAuthnRegistrationOptionsResponse / OnWebAuthnAuthenticationOptionsResponse.
// Metadata Service configuration
MDS.Enabled := True;
MDS.MDS_FileName := 'mds.json';
MDS.RootCert_FileName := 'root.pem';
end;
// Hook events
FWebAuthn.OnWebAuthnRegistrationOptionsRequest := AuthnRegOptionsRequest;
FWebAuthn.OnWebAuthnRegistrationOptionsResponse := AuthnRegOptionsResponse;
FWebAuthn.OnWebAuthnRegistrationValidateCertificate := AuthnRegVerify;
FWebAuthn.OnWebAuthnRegistrationSuccessful := AuthnRegSuccess;
FWebAuthn.OnWebAuthnAuthenticationOptionsRequest := AuthnOptionsRequest;
FWebAuthn.OnWebAuthnAuthenticationSuccessful := AuthnSuccess;
end;
Olay Uygulamaları
procedure TForm1.AuthnRegOptionsRequest(Sender: TObject;
const Request: TsgcWebAuthn_RegistrationOptions_Request; var Accept: Boolean);
begin
// Verify user is eligible for registration
Accept := not UserExists(Request.Username);
end;
procedure TForm1.AuthnRegOptionsResponse(Sender: TObject;
const Request: TsgcWebAuthn_RegistrationOptions_Request;
const Response: TsgcWebAuthn_RegistrationOptions_Response);
begin
// Optionally assign a user handle (binary identifier)
Response.User.Id := HexToBin(UserGUIDToHex(GenerateGUID));
Response.AuthenticatorSelection.AuthenticatorAttachment := 'platform';
end;
procedure TForm1.AuthnRegVerify(Sender: TObject;
const Request: TsgcWebAuthn_RegistrationVerify_Request;
const Validate: TsgcWebAuthnValidateAttestationStatement; var Accept: Boolean);
begin
// Perform extra attestation validation against MDS entries
Accept := ValidateAttestationWithMDS(Validate);
end;
procedure TForm1.AuthnRegSuccess(Sender: TObject;
const Registration: TsgcWebAuthn_Registration;
const CredentialRecord: TsgcWebAuthn_CredentialRecord; var Accept: Boolean);
begin
// Persist credential details in database
SaveCredentialToDB(
CredentialRecord.Username,
CredentialRecord.CredentialId,
CredentialRecord.PublicKey,
CredentialRecord.SignCount,
CredentialRecord.UserId
);
Accept := True;
end;
procedure TForm1.AuthnOptionsRequest(Sender: TObject;
const Request: TsgcWebAuthn_AuthenticationOptions_Request;
var CredentialRecords: TsgcWebAuthn_CredentialRecords; var Accept: Boolean);
begin
// Retrieve all credential records for user
CredentialRecords := LoadCredentialRecordsFromDB(Request.Username);
Accept := True;
end;
procedure TForm1.AuthnSuccess(Sender: TObject;
const Request: TsgcWebAuthn_AuthenticationVerify_Request;
const Authentication: TsgcWebAuthn_Authentication; var Accept: Boolean);
var
StoredCounter: Cardinal;
begin
// Ensure sign counter increases
StoredCounter := GetSignCounterFromDB(Authentication.Credential.CredentialRecord.CredentialId);
Accept := Authentication.Credential.CredentialRecord.SignCount > StoredCounter;
if Accept then
begin
UpdateSignCounterInDB(Authentication.Credential.CredentialRecord.CredentialId,
Authentication.Credential.CredentialRecord.SignCount);
IssueSessionToken(Authentication.Credential.CredentialRecord.Username);
end;
end;
Önemli Noktalar
- Challenge Rastgeleliliği – Her challenge, sunucu tarafından dahili olarak üretilen, onaltılık olarak kodlanmış, kriptografik olarak rastgele 32 baytır; bu da ek bir yapılandırma olmadan yeniden yürütme saldırılarına karşı zaten dirençlidir.
- Özel Kullanıcı Tutamaçları – Benzersiz bir ikili kullanıcı tutamacı atamak, kimlik doğrulayıcının kullanıcı adlarından bağımsız, gizliliği koruyan bir tanımlayıcı saklamasına olanak tanır.
- Meta Veri Tabanlı Attestation Doğrulaması –
ValidateAttestationWithMDSrutini, kimlik doğrulayıcı modelini, durum raporlarını ve iptal listelerini çapraz olarak denetler ve yalnızca güvenilir cihazların kaydedilmesini sağlar. - İmza Sayacı Zorunluluğu –
AuthnSuccess, kimlik doğrulayıcının sayacını kesinlikle artırmayan yanıtları reddeder ve klonlanmış kimlik bilgilerini algılar. - Veritabanı Entegrasyonu – Kimlik bilgisi verileri, imza sayaçları ve oturum belirteçleri harici kalıcılık fonksiyonları aracılığıyla saklanır ve güncellenir; bu, bileşenin gerçek dünyadaki bir arka uçla nasıl entegre edileceğini gösterir.
- Kaynaklar Arası Iframe Desteği –
AllowCrossOriginsaracılığıyla etkinleştirilir veTopOriginsyapılandırılır; bu, gömülü çerçevelerden başlatılan WebAuthn akışlarına (ör. farklı bir alan adındaki oturum açma bileşeni) olanak tanır. - Attestation Politikası – MDS ile birleştirilen doğrudan attestation, yalnızca onaylanmış kimlik doğrulayıcıların kaydolabilmesini sağlar; bu, kurumsal uyumluluk senaryoları için yararlıdır.
- Taşıma Seçimi – Gösterilmese de, olaylar kabul edilebilir taşımaları (ör.
USB,NFC,BLE) kısıtlayarak hangi tür kimlik doğrulayıcılara izin verileceğini özelleştirebilir.
