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
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.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).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.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.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ı
| Üye | Id | Açıklama |
|---|---|---|
Sms | 1 | Sunucu üretimi 4 haneli kod, NetGSM ile SMS |
Email | 2 | Sunucu üretimi kod, e-posta ile |
Authenticator | 3 | TOTP (OtpNet, RFC 6238) — authenticator uygulaması üretir |
Hata senaryoları
| Durum | Nerede | Sonuç |
|---|---|---|
| Telefon kayıtlı değil | SignInUserCommandHandler | ApplicationException → 400 |
| Kod yanlış / süresi dolmuş | User.VerifyChallenge → handler | ApplicationException → 400 |
| TOTP kodu geçersiz | VerifyTotpCommandHandler | ApplicationException → 400 |
| TOTP kodu tekrar kullanıldı | User.VerifyTotp | DomainException → 400 |
| Resend cooldown ihlali | UserOtpChallenge.Refresh | DomainException (“lütfen bekleyin”) → 400 |
| 3 resend aşıldı | UserOtpChallenge.Refresh | DomainException → 400 |
İ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.