Skip to content

Repository files navigation

SignalR Test - Cookie-based Authentication

Bu proje, .NET Core SignalR Hub'ı ve cookie tabanlı JWT authentication kullanan bir test uygulamasıdır.

Özellikler

  • ✅ SignalR Hub ile real-time iletişim
  • ✅ HttpOnly + Secure cookie ile JWT token yönetimi
  • ✅ Cross-subdomain cookie desteği (.example.com)
  • ✅ CORS yapılandırması (subdomain'ler için)
  • ✅ Development ortamında localhost desteği (otomatik CORS ve cookie ayarları)
  • ✅ Domain yapılandırması appsettings.json üzerinden yönetilir
  • ✅ JWT Bearer authentication
  • ✅ SignalR [Authorize] attribute ile koruma
  • ✅ WebSocket ve Long Polling desteği
  • ✅ Otomatik cookie gönderimi (browser tarafında)

Proje Yapısı

SignalRCookieBaseAuth/
├── Program.cs              # Ana yapılandırma ve middleware
├── Hubs/
│   └── ChatHub.cs         # SignalR Hub sınıfı
├── wwwroot/
│   └── index.html         # Test client HTML sayfası
├── appsettings.json       # Yapılandırma dosyası
└── SignalRCookieBaseAuth.csproj     # Proje dosyası

Gereksinimler

  • .NET 8.0 SDK
  • Modern web tarayıcısı (Chrome, Firefox, Edge)

Kurulum ve Çalıştırma

1. Projeyi Çalıştırma

dotnet restore
dotnet run

Uygulama şu adreslerde çalışacaktır:

  • HTTPS: https://localhost:5000
  • HTTP: http://localhost:5000

2. Test Client'a Erişim

Tarayıcıda şu adreslerden birine gidin:

  • https://localhost:5000/index.html (önerilen)
  • http://localhost:5000/index.html
  • https://localhost:5000/ (index.html otomatik yüklenecek)
  • http://localhost:5000/

3. Login

Test credentials:

  • Username: test
  • Password: test123

Login yaptıktan sonra SignalR bağlantısı otomatik olarak kurulacaktır.

Production Yapılandırması

  1. appsettings.json dosyasında domain ve JWT ayarlarını güncelleyin:
{
  "Domain": {
    "BaseDomain": "example.com",
    "CookieDomain": ".example.com",
    "CorsOrigins": [
      "https://example.com",
      "https://www.example.com",
      "https://app.example.com",
      "https://client.example.com"
    ]
  },
  "Jwt": {
    "Secret": "GüçlüBirSecretKeyEnAz32Karakter!",
    "Issuer": "https://api.example.com",
    "Audience": "https://example.com"
  }
}
  1. Tüm domain ayarları appsettings.json üzerinden yönetilir. Program.cs içinde manuel değişiklik yapmanıza gerek yoktur.
  1. wwwroot/index.html dosyasındaki API_BASE_URL değişkeni otomatik olarak production domain'ini kullanır. Manuel değişiklik gerekmez:
const API_BASE_URL = window.location.origin.includes('localhost') 
    ? window.location.origin  // Development: aynı origin
    : 'https://api.example.com';  // Production: API subdomain
  1. HTML dosyasını statik bir web sunucusunda barındırın.

Cookie Yapılandırması

Cookie'ler şu özelliklere sahiptir:

  • HttpOnly: JavaScript'ten erişilemez (güvenlik)
  • Secure: Production'da sadece HTTPS üzerinden gönderilir (Development'ta HTTP için false olabilir)
  • SameSite:
    • Development: Lax (HTTP uyumluluğu için)
    • Production: None (Cross-site istekler için)
  • Domain:
    • Development: Set edilmez (localhost özel bir domain)
    • Production: .example.com (tüm subdomain'lerde geçerli)
  • Path=/ Tüm path'lerde geçerli

Not: Tüm cookie ayarları appsettings.json içindeki Domain yapılandırmasına göre otomatik olarak ayarlanır.

Authentication Flow

  1. Kullanıcı /api/auth/login endpoint'ine POST isteği gönderir
  2. Backend JWT token oluşturur ve access_token adlı cookie'ye set eder
  3. Browser, tüm sonraki isteklerde (HTTP, WebSocket, Long Polling) cookie'yi otomatik gönderir
  4. JWT Bearer middleware cookie'den token'ı okur ve doğrular
  5. SignalR Hub [Authorize] attribute ile korunur

SignalR Hub Metodları

  • SendMessage(string user, string message) - Mesaj gönderir
  • JoinGroup(string groupName) - Gruba katılır
  • LeaveGroup(string groupName) - Gruptan ayrılır

Hub Events

  • ReceiveMessage - Yeni mesaj alındığında
  • UserConnected - Kullanıcı bağlandığında
  • UserDisconnected - Kullanıcı bağlantısı kesildiğinde

Güvenlik Notları

⚠️ ÖNEMLİ:

  • Production'da mutlaka güçlü bir JWT Secret kullanın
  • HTTPS kullanın (Secure cookie için zorunlu)
  • CORS origin'lerini sadece gerekli domain'lerle sınırlandırın
  • Gerçek kullanıcı doğrulaması için veritabanı entegrasyonu ekleyin
  • Rate limiting ekleyin
  • CSRF koruması düşünün (SameSite=None kullanıyorsanız)

Test Senaryoları

  1. Login Test:

    • Yanlış credentials ile login deneyin
    • Doğru credentials ile login yapın
    • Cookie'nin set edildiğini kontrol edin (DevTools > Application > Cookies)
  2. SignalR Connection Test:

    • Login sonrası otomatik bağlantıyı kontrol edin
    • Mesaj gönderip almayı test edin
    • Bağlantıyı kesip otomatik reconnect'i test edin
  3. Cross-Subdomain Test:

    • appsettings.json içinde domain ayarlarını yapılandırın
    • API'yi api.example.com üzerinde çalıştırın
    • Client'ı app.example.com üzerinde çalıştırın
    • Cookie'nin her iki domain'de de çalıştığını doğrulayın
    • Cookie domain'inin .example.com olarak set edildiğini kontrol edin (DevTools > Application > Cookies)

Sorun Giderme

Cookie gönderilmiyor

  • Development: HTTP kullanıyorsanız Secure=false olacaktır (normal)
  • Production: HTTPS kullanıldığından emin olun
  • Cookie domain'inin doğru olduğunu kontrol edin (appsettings.json > Domain:CookieDomain)
  • Localhost'ta cookie domain set edilmez (normal davranış)
  • credentials: 'include' ve withCredentials: true ayarlarının olduğunu doğrulayın

CORS hatası

  • Development: Localhost otomatik olarak izin verilir
  • Production: Origin'in appsettings.json > Domain:CorsOrigins içinde tanımlı olduğunu kontrol edin
  • AllowCredentials() metodunun çağrıldığını doğrulayın

Authentication hatası

  • Cookie'nin set edildiğini kontrol edin
  • JWT token'ın geçerli olduğunu doğrulayın
  • Token expiration süresini kontrol edin

Lisans

Bu proje test amaçlıdır.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages