2016-04-14 31 views
1

Oturum açma ekranının arkasında bazı yönetimsel işlevleri olan bir C# projem var.Oturum kapatma sonrasında yetkilendirmenin yeniden kullanılması nasıl engellenir

Son bir öneride, bir saldırı potansiyeli ile karşılaştık: kullanıcı bir form gönderirse, çıkış yapar ve form yazısı tekrarlanır (burp veya benzer bir araç kullanılarak) sunucu hala oturum açmış olarak görür. ve doğru cevap verir.

Tüm 'Yönetici' denetleyicisi, uygun roller ayarlanmış [Authorize] olarak ayarlanmıştır. Oturumu kapattığımda,

numaralı telefonu arayın ve kullanıcıyı bir başlangıç ​​sayfasına yönlendiriyorum.

Okuduğum her şey, bunun olmasını önlemek için bunların hepsinin olması gerektiğini gösteriyor. Ben aşağıdakileri yapabilirsiniz söyledi: my yönetim alanında

  • (geğirmek yakalanan bir JSON POST eylemi,) bir arama
  • Bkz arama sonuçları gerçekleştir üzerinde

    1. Log
    2. Çıkış
    3. önceki yanıtına uygun geğirmek bir sunucu yanıtını görün eder ('.ASPXAUTH' çerez içerir) geğirmek JSON POST tekrarlayın

    Bunu önlemek için ne yapabilirim?

  • +0

    Yeniden oynatma saldırılarını önlemek için genelde yanıt yanıtı kimlik doğrulamasını nonce ile kullanabilirsiniz. –

    +0

    'Session.Abandon' sunucu tarafı oturumunu temizlemeli; Bu işe yaramaz. – SLaks

    +0

    @SLaks: Ben de okudum. Yine de, hala gerçekleşir. Testi kendim yaptım. – Jeff

    cevap

    0

    Çok fazla deneyden sonra, bir çözüm buldum!

    System.Web.HttpContext.Current.Application.Lock(); 
    System.Web.HttpContext.Current.Application[HttpContext.User.Identity.Name] = true; 
    System.Web.HttpContext.Current.Application.UnLock(); 
    

    ve kullanıcı (FormsService dışına imzalama yapabilirsiniz Oturumu öldürmeden önce) dışarı açtığında ben bunu tersine:

    kullanıcı giriş yaptığında ben aşağıdakileri yapın.

    Sonra ben zaten 'OnAuthorization' yönteminde bunun için custom AuthorizeAttribute override sahip olmasından yararlanmak: saklayarak

    /* Some other customer stuff that isn't relevant */ 
    
    base.OnAuthorization(filterContext); 
    
    if (System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name] != null && 
        ((bool)System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name]) == true) 
    { 
        //The user is ok to log in, and should be validated now. 
    } 
    else 
    { 
        HandleUnauthorizedRequest(filterContext); 
    } 
    

    kullanıcının giriş yapan uygulama durumunda statü, öyleyim giriş yaptıkları durumu doğrulayabilir. Bazı insanlar, statik bir sınıfın MVC'deki uygulama durumuna erişmekten daha iyi olacağına inanmaktadır, ancak Uygulama bu durumda benim için daha iyi olacaktır (büyük ölçüde bu durumun bakımını sürdürecek olan diğer kişilere daha aşina olduğu için). Kod ve Birim Testlerin kolaylığı için).

    İlgili konular