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.csChallenge token şeması
HemSignIn 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 SPAresend-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:
UserOtpChallenge.Refresh içindedir:
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.