Skip to main content
BuildingBlocks.DeviceDetector, gelen HTTP isteğinden IP, cihaz ve güven kararı bilgisini üretir. Login gibi hassas akışlarda risk skoru hesaplamak, oturum kaydına cihaz parmak izi yazmak ve şüpheli istekleri ek doğrulamaya yönlendirmek için kullanılır. Tek giriş noktası IClientSecurityContext fasadıdır.

Arayüzler

Arayüzİmzaİmplementasyon
IClientSecurityContextIpDto GetIp() · DeviceDto GetDevice() · TrustDecisionDto EvaluateTrust()HttpClientSecurityContext (fasad)
IClientIpResolvergerçek IP’yi çözer (X-Forwarded-For, CF-Connecting-IP)ClientIpResolver
IDeviceDetectorUser-Agent’tan cihaz/tarayıcı/OS çıkarırDefaultDeviceDetector
ITrustEvaluatorTrustDecisionDto Evaluate(IpDto ip, DeviceDto device)TrustEvaluator

Value object’ler

IClientSecurityContext üç immutable DTO döndürür; bunlar domain tarafında User.StartSession gibi metotlara taşınarak UserSession kaydına yazılır.
DTOÜyeler
IpDtoIpAddress, IsPrivateNetwork, IsProxy, IsVpnSuspected, IsTorExitNode, Source (Direct/X-Forwarded-For/CF-Connecting-IP)
DeviceDtoClientType (Mobile/Desktop/Bot/Unknown), Browser, BrowserVersion, Os, OsVersion, Name, Brand, Model, IsBot
TrustDecisionDtoLevel (Trusted/Challenge/Untrusted), RiskScore (int), Reason

Güven değerlendirmesi — risk skoru

TrustEvaluator, IP ve cihaz sinyallerini toplayarak bir risk puanı çıkarır ve eşiklere göre karar verir:
SinyalPuan
device.IsBot+80
ClientType == "Bot"+60
ClientType == "Unknown"+20
ip.IsTorExitNode+70
ip.IsVpnSuspected+40
ip.IsProxy+30
ip.IsPrivateNetwork+15
ip.Source != "Direct"+10
Toplam riskKarar
< 30Trusted
30 – 69Challenge (ek doğrulama iste)
>= 70Untrusted (reddet)

DI kaydı — AddDeviceDetector

Tüm servisler scoped’tur (HttpContext’e bağlı).
public static IServiceCollection AddDeviceDetector(this IServiceCollection services, IConfiguration configuration)
{
    services.AddScoped<IDeviceDetector, DefaultDeviceDetector>();
    services.AddScoped<IClientIpResolver, ClientIpResolver>();
    services.AddScoped<ITrustEvaluator, TrustEvaluator>();
    services.AddScoped<IClientSecurityContext, HttpClientSecurityContext>();  // fasad
    return services;
}
// Program.cs — AddJwt'ten sonra
builder.Services.AddDeviceDetector(builder.Configuration);
AddDeviceDetector HttpContext’e erişir; IHttpContextAccessor’ın pipeline’da kayıtlı olması gerekir (AddJwt/AddKeycloak zaten ekler).

Kullanım — login risk skoru

[HttpPost("api/website/public/auth/login")]
public async Task<IActionResult> Login([FromBody] LoginRequest req, [FromServices] IClientSecurityContext security)
{
    TrustDecisionDto trust = security.EvaluateTrust();
    DeviceDto device = security.GetDevice();
    IpDto ip = security.GetIp();

    if (trust.Level == TrustLevel.Untrusted)
        return StatusCode(403, $"İstek reddedildi: {trust.Reason}");

    if (trust.Level == TrustLevel.Challenge)
    {
        // OTP / reCAPTCHA gibi ek adım iste
        return await RequireAdditionalVerificationAsync(req, trust.RiskScore);
    }

    // Oturum başlat — cihaz/IP bilgisi UserSession'a yazılır
    var command = new LoginCommand(req.Phone, device, ip);
    return Ok(await _mediator.Send(command));
}
Domain tarafında bu bilgi aggregate’e taşınır:
// User aggregate
public void StartSession(DeviceInfo device, ClientIpInfo ip, ...)
{
    var session = UserSession.Create(this.Id, device, ip, ...);
    _sessions.Add(session);
    AddDomainEvent(new UserSessionStartedDomainEvent(Id, session.Id));
}

İlgili

Kimlik doğrulama

Oturum başlatma ve token üretimi.

Bot koruması

Challenge kararında reCAPTCHA v3 ile ek doğrulama.

OTP

Yüksek riskte ikinci faktör.

Domain

UserSession ve StartSession metodu.