WebAuthn Advanced Usage Example

· Bileşenler

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

  1. 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.
  2. Ö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.
  3. Meta Veri Tabanlı Attestation DoğrulamasıValidateAttestationWithMDS rutini, kimlik doğrulayıcı modelini, durum raporlarını ve iptal listelerini çapraz olarak denetler ve yalnızca güvenilir cihazların kaydedilmesini sağlar.
  4. İmza Sayacı ZorunluluğuAuthnVerify, kimlik doğrulayıcının sayacını kesinlikle artırmayan yanıtları reddeder ve klonlanmış kimlik bilgilerini algılar.
  5. 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.
  6. Kaynaklar Arası Iframe DesteğiAllowCrossOrigins aracılığıyla etkinleştirilir ve TopOrigins yapı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.
  7. 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.
  8. 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.