Dokümantasyon
TOKEN HATA COZUMU
Token Hatası Çözümü
Yeni Token Mimarisini Anlamak
- Sunucu artık kullanıcıların şifreleme anahtarını (master key) hiçbir yerde saklamaz.
- Token tamamen
base64(userId:encryptionKey)formatındadır ve bu değeri yalnızca kullanıcı bilir. - Aynı token, Chrome Extension ve Windows uygulamasında kullanıldığı sürece mevcut şifreler çözülebilir.
- Token kaybolursa eski veriler açılamaz; bu nedenle tokenınızı mutlaka güvenli bir yerde saklayın.
Token Oluşturma / Kaydetme Adımları
- Web arayüzünde sağ üstteki Token menüsünü açın.
- Elinizde bir token varsa “Mevcut Token” alanına yapıştırıp Kaydet’e tıklayın. Tarayıcı tokenı yerelde saklar.
- Yeni bir anahtar başlatmak istiyorsanız “Yeni Şifreleme Anahtarı” alanını boş bırakıp Yeni Token Oluştur butonuna basın. Sunucu yeni bir anahtar üretip tokenı döner; bu değeri mutlaka yedekleyin.
- Kopyala butonu ile tokenı panoya alıp Chrome Extension veya Windows uygulamasına yapıştırabilirsiniz.
Middleware Davranışı
TokenAuthenticationMiddleware, gelen Authorization: Bearer {token} header’ını inceleyip encryption key’i claims ve HttpContext.Items içine taşır:
var tokenBytes = Convert.FromBase64String(token);
var tokenString = Encoding.UTF8.GetString(tokenBytes);
var parts = tokenString.Split(':');
if (parts.Length == 2)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, parts[0]),
new Claim("EncryptionKey", parts[1])
};
context.User = new ClaimsPrincipal(new ClaimsIdentity(claims, "Token"));
context.Items["TokenEncryptionKey"] = parts[1];
}
Session veya veritabanı kullanılmaz; anahtar tamamen token içinden alınır.
Sık Karşılaşılan Senaryolar
- Token Kayboldu: Aynı key’i bilmiyorsanız eski şifreleri çözemeyeceğiniz için yeni bir anahtar oluşturmanız gerekir. Bu durumda veriyi yeniden girmeniz gerekir.
TypeError: Failed to fetchhatası: Tarayıcı token göndermiyorsa veya CORS izinleri eksikse oluşur. Tarayıcıdaki tokenı temizleyip yeniden kaydedin, API adresinizin doğru olduğundan emin olun.- Şifre çözülemiyor: Token farklı bir anahtar içeriyor demektir. Chrome Extension ve web arayüzünde aynı token’ı kullandığınızdan emin olun.
Test Kontrol Listesi
- Token modalını açıp mevcut tokenınızı kaydedin veya yeni token üretin.
- Web arayüzünden örnek bir şifre ekleyin; ardından “Göster” butonuyla şifreyi çözüp doğrulayın.
- Aynı token’ı Chrome Extension’a girip “Kullanıcı Adı Şifre Yapıştır” özelliğini test edin.
- Windows uygulamasında Ayarlar > Token alanına aynı değeri girerek şifre listesini çekin.
- Herhangi bir noktada hata alırsanız tokenı tekrar kontrol edin; gerekirse eski tokenınızı geri yükleyin.
Token Oluşturma Hatası Çözümü
Sorun
Token oluştururken "Token oluştururken hata oluştu" hatası alınıyor.
Olası Nedenler
- Session'da Encryption Key Yok: Session'a encryption key kaydedilmemiş olabilir
- Session Yüklenmemiş: Session henüz yüklenmemiş olabilir
- Session Commit Edilmemiş: Session'a yazılan veriler commit edilmemiş olabilir
- User ID Bulunamıyor: Kullanıcı claim'leri doğru set edilmemiş olabilir
Çözüm
1. AuthController Güncellemesi
- Session'ı yükleme (LoadAsync)
- Encryption key yoksa oluşturma
- Session'ı commit etme (CommitAsync)
- Detaylı hata mesajları
2. Program.cs Güncellemesi
- OnCreatingTicket event'inde session yükleme
- Encryption key oluşturulduktan sonra session commit etme
- Middleware sırasını düzeltme (session authentication'dan önce)
3. JavaScript Güncellemesi
- Detaylı hata mesajları
- Console'a hata loglama
Yapılan Değişiklikler
AuthController.cs
[HttpGet("token")]
public IActionResult GetToken()
{
try
{
// Session'ı başlat (eğer başlatılmamışsa)
HttpContext.Session.LoadAsync().Wait();
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (string.IsNullOrEmpty(userId))
{
// Tüm claim'leri logla
var allClaims = User.Claims.Select(c => $"{c.Type}: {c.Value}").ToList();
return Unauthorized(new { message = "Kullanici bulunamadi", claims = allClaims });
}
var encryptionKey = HttpContext.Session.GetString("EncryptionKey");
// Eğer encryption key yoksa, yeni bir tane oluştur
if (string.IsNullOrEmpty(encryptionKey))
{
encryptionKey = _cryptoService.GenerateKey();
HttpContext.Session.SetString("EncryptionKey", encryptionKey);
// Session'ı commit et
HttpContext.Session.CommitAsync().Wait();
}
// Token oluştur
var token = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userId}:{encryptionKey}"));
return Ok(new
{
token = token,
userId = userId,
message = "Token basariyla olusturuldu"
});
}
catch (Exception ex)
{
return StatusCode(500, new { message = "Token olusturulurken hata olustu", error = ex.Message, stackTrace = ex.StackTrace });
}
}
Program.cs - OnCreatingTicket Event
// Encryption key'i session'a kaydet
if (context.HttpContext.Session != null)
{
// Session'ı yükle
await context.HttpContext.Session.LoadAsync();
var encryptionKey = context.HttpContext.Session.GetString("EncryptionKey");
if (string.IsNullOrEmpty(encryptionKey))
{
encryptionKey = cryptoService.GenerateKey();
context.HttpContext.Session.SetString("EncryptionKey", encryptionKey);
// Session'ı commit et
await context.HttpContext.Session.CommitAsync();
}
}
Program.cs - Middleware Sırası
// Session'ı authentication'dan önce başlat
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
// Token authentication middleware'i authorization'dan sonra
app.UseMiddleware<UI.Web.Middleware.TokenAuthenticationMiddleware>();
Test
- Uygulamayı yeniden başlatın
- Web uygulamasına giriş yapın
- "Token Al" butonuna tıklayın
- Token başarıyla oluşturulmalı
Sorun Giderme
Hala hata alıyorsanız:
Tarayıcı konsolunu kontrol edin (F12)
- Hata mesajını görüntüleyin
- Detaylı hata bilgilerini kontrol edin
Session'ı kontrol edin
- Session cookie'sinin set edildiğini kontrol edin
- Session'ın yüklendiğini kontrol edin
User Claim'lerini kontrol edin
- User ID'nin doğru set edildiğini kontrol edin
- Tüm claim'leri loglayın
Uygulamayı yeniden başlatın
- Değişikliklerin uygulanması için uygulamayı yeniden başlatın
Önemli Notlar
- Session'ın yüklenmesi ve commit edilmesi önemlidir
- Encryption key yoksa otomatik olarak oluşturulur
- Hata mesajları detaylıdır ve console'a loglanır
- Middleware sırası önemlidir (session authentication'dan önce)