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 := TsgcWSAPIServer_WebAuthn.Create(nil);
FWebAuthn.Server := FHTTPServer;
FWebAuthn.Enabled := True;
// Endpoint remapping
FWebAuthn.EndpointOptions.AuthenticationOptions := '/auth/options';
FWebAuthn.EndpointOptions.AuthenticationVerify := '/auth/verify';
FWebAuthn.EndpointOptions.RegistrationOptions := '/reg/options';
FWebAuthn.EndpointOptions.RegistrationVerify := '/reg/verify';
// Relying-party definition
with FWebAuthn.WebAuthnOptions do
begin
RelyingParty := 'secure.example.com';
Origins := 'https://app.example.com;https://login.example.net';
TopOrigins := 'https://host.example.org';
AllowCrossOrigins := True;
// Cryptographic & UX policies
Algorithms := 'ES256,RS256';
UserVerification := 'preferred';
Attestation := 'direct';
TimeoutMS := 60000;
// Challenge settings
ChallengeOptions.ChallengeSize := 64; // 512-bit challenges
ChallengeOptions.RandomFunc := MyCryptoRandom; // custom RNG
// Metadata Service configuration
MDS.Enabled := True;
MDS.MDS_FileName := 'mds.json';
MDS.RootCert_FileName := 'root.pem';
end;
// Hook events
FWebAuthn.OnWebAuthnRegistrationOptionsRequest := AuthnRegOptionsRequest;
FWebAuthn.OnWebAuthnRegistrationVerify := AuthnRegVerify;
FWebAuthn.OnWebAuthnRegistrationSuccessful := AuthnRegSuccess;
FWebAuthn.OnWebAuthnAuthenticationOptionsRequest := AuthnOptionsRequest;
FWebAuthn.OnWebAuthnAuthenticationVerify := AuthnVerify;
FWebAuthn.OnWebAuthnAuthenticationSuccessful := AuthnSuccess;
end;
Olay Uygulamaları
procedure TForm1.AuthnRegOptionsRequest(Sender: TObject;
const Request: TsgcWebAuthnRequestOptions; Response: TsgcWebAuthnResponseOptions);
begin
// Verify user is eligible for registration
if UserExists(Request.Username) then
raise Exception.Create('Username already registered');
// Optionally assign a user handle (binary identifier)
Response.User.ID := HexToBin(UserGUIDToHex(GenerateGUID));
Response.AuthenticatorSelection.AuthenticatorAttachment := 'platform';
end;
procedure TForm1.AuthnRegVerify(Sender: TObject; const Credential: TsgcWebAuthnCredential; var Success: Boolean);
begin
// Perform extra attestation validation against MDS entries
Success := ValidateAttestationWithMDS(Credential);
end;
procedure TForm1.AuthnRegSuccess(Sender: TObject; const Credential: TsgcWebAuthnCredential);
begin
// Persist credential details in database
SaveCredentialToDB(
Credential.Username,
Credential.CredentialID,
Credential.PublicKey,
Credential.SignCount,
Credential.UserHandle
);
end;
procedure TForm1.AuthnOptionsRequest(Sender: TObject;
const Request: TsgcWebAuthnRequestOptions; Response: TsgcWebAuthnResponseOptions);
begin
// Retrieve all credential IDs for user
Response.AllowCredentials := LoadCredentialIdsFromDB(Request.Username);
end;
procedure TForm1.AuthnVerify(Sender: TObject; const Credential: TsgcWebAuthnCredential; var Success: Boolean);
var
StoredCounter: Cardinal;
begin
// Ensure sign counter increases
StoredCounter := GetSignCounterFromDB(Credential.CredentialID);
if Credential.SignCount <= StoredCounter then
Success := False
else
Success := True;
end;
procedure TForm1.AuthnSuccess(Sender: TObject; const Credential: TsgcWebAuthnCredential);
begin
UpdateSignCounterInDB(Credential.CredentialID, Credential.SignCount);
IssueSessionToken(Credential.Username);
end;
Önemli Noktalar
- Challenge Sağlamlaştırma – Challenge boyutu genişletilerek ve kriptografik olarak güvenli bir RNG kullanılarak yeniden yürütme saldırıları daha da azaltılır.
- Ö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 –
AuthnVerify, 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.
