WebAuthn Advanced Usage Example

· Bileşenler
WebAuthn Advanced Usage Example

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

  1. 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.
  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ğu – AuthnSuccess, 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ği – AllowCrossOrigins 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.