Skip to main content
Vatandaş tarafı kimlik doğrulama iki kademelidir: önce challenge (kim olduğunu telefonla/şifresiz bildir), sonra verify (OTP SMS kodu veya TOTP authenticator kodu). Verify başarılı olunca access token + refresh token üretilir ve bir oturum (UserSession) başlatılır. Bu sayfa SignInUser, VerifyOtp, VerifyTotp ve ResendOtp akışlarının tamamını gerçek koddan anlatır.
İlgili dosyalar: Application/Features/Authentication/Website/Commands/{SignInUser,VerifyOtp,VerifyTotp,ResendOtp}/* · Domain/AggregatesModel/UserAggregate/{User,UserOtpChallenge}.cs · Application/Services/Identity/IUserAuthService.cs

Challenge token şeması

Hem SignIn hem SignUp, doğrudan oturum açmaz; bir challenge token döner. Bu, OTPChallenge JWT şemasıyla imzalanır (OtpType.Sms/Email/Authenticator’a göre), kısa ömürlüdür ve userId + challengeId’yi taşır. SPA bunu saklayıp verify-* çağrılarında bearer olarak gönderir; handler tarafında IOtpChallengeContext token’dan bu değerleri okur.

Sequence — telefon ile giriş

Adım adım

1

SignIn — kullanıcıyı bul, yöntemi seç

SignInUserCommandHandler telefonla kullanıcıyı bulur. TOTP etkinse OTP SMS göndermek yerine doğrudan TOTP challenge token döner:
IsTotpEnabled, Totp is { IsEnabled: true } demektir. Dönen DTO’daki IsTotpEnabled flag’i SPA’ya hangi ekranı (SMS kodu mu, authenticator mı) göstereceğini bildirir.
2

OTP üretimi ve geçerlilik

User.AddOtpChallenge bir UserOtpChallenge oluşturur. Geçerlilik süresi tipe bağlıdır — SMS için 1 dk, e-posta için 2 dk:
UserOtpGeneratedDomainEvent SaveChanges sonrası dispatch edilir; SendOtpSmsDomainEventHandler SMS gönderir (tip SMS değilse no-op).
3

VerifyOtp — kod doğrula, oturum başlat

VerifyOtpCommand yalnızca Code ve IsTrustedDevice taşır; userId/challengeId challenge token’dan (IOtpChallengeContext) okunur:
User.VerifyChallenge kodu doğrularsa tipine göre IsPhoneNumberVerified / IsEmailVerified bayrağını set eder ve ilgili domain event’i (UserPhoneNumberVerifiedDomainEvent vb.) yayar. UserOtpChallenge.Verify her gerçek denemede AttemptCount’u artırır, süre dolduysa false döner.
4

VerifyTotp — authenticator kodu

TOTP etkinse kullanıcı authenticator uygulamasındaki 6 haneli kodu girer. VerifyTotpCommandHandler kodu IAuthenticationTotpService ile doğrular (OtpNet, RFC 6238, pencere ±1):
User.VerifyTotp(timeStep), Totp.CanAccept(timeStep) ile aynı zaman penceresinin tekrar kullanımını reddeder (“Kod tekrar kullanılamaz”) ve MarkUsed ile işaretler. TOTP yapılandırması için Authenticator Servisi.
5

Sonuç — token'lar ve cookie

Hem VerifyOtp hem VerifyTotp bir SignInResult(accessToken, refreshToken, user) döner. Controller refresh token’ı HttpOnly cookie’ye yazar (XSS koruması), gövdede yalnızca access token + kullanıcıyı döner:

ResendOtp — cooldown ve limitler

Kod ulaşmazsa SPA resend-otp çağırır (challenge token ile yetkilendirilir). ResendOtpCommand gövdesizdir; bağlam token’dan gelir. TOTP etkinse yine TOTP challenge döner; aksi halde mevcut challenge yenilenir:
Asıl iş kuralları UserOtpChallenge.Refresh içindedir:
Limitler challenge başına: en fazla 3 yeniden gönderim, gönderimler arası 60 sn cooldown. Yeni kod gelince AttemptCount sıfırlanır ama ResendCount birikir. Sınır aşılırsa kullanıcı yeni bir sign-in/sign-up ile yeni challenge başlatmalıdır.

OtpType referansı

Hata senaryoları

İlgili

Vatandaş Kaydı

SignUp → ilk OTP doğrulama akışı.

Authenticator (TOTP)

Secret üretimi, QR, doğrulama penceresi.

JWT BuildingBlock

Access / refresh / challenge token şemaları.

SMS Servisi

NetGSM OTP gönderimi.