2015-09-30 28 views
5

Uygulamamda kimlik doğrulama (aspwin kimlik) için asp.net kimlik 2.0 kullanıyorum. Oturum ele geçirme: Kimlik girdiğimde, AspNet.ApplicationCookie.then'i oluşturduğumda, AspNet.ApplicationCookie değerini kopyaladım.Uygulamadan çıkış yaptım.Aramadan sonra, el ile tanımlama bilgisi (AspNet.ApplicationCookie) oluşturuyorum ve yeniden başlatıyorum ben ana sayfa.Privilege Escalation & Session Kimlik Çalma MVC5

Ayrıcalık Escalation: i Kullanıcı kopyalanan AI (AspNet.ApplicationCookie) onun çerez olarak oturum Aynı zamanda ve ben BI B kullanıcısı Cookie düzenlediğimden bir kullanıcı olarak oturum out.After açmış ve yapıştırılan Kullanıcı A çerez ve kaydedildi. Tarayıcıyı yeniledikten sonra UserA erişimi ve kimlik doğrulaması alabilirim.

Tüm oturumları temizliyorum ve tüm çerezleri siliyorum Oturumu kapattığımda.Even Asp.Net kimliği (Owin) her zaman yeni AspNet.ApplicationCookie üretir.Ama yine de eski tanımlama bilgilerini kabul eder ve bana erişim sağlar Neden bilmiyorum Herhangi biri, çıkış yaptıktan sonra eski AspNet.ApplicationCookie'yi geçersiz kılma hakkını verebilir. Bu Startup.Auth.cs benim kodudur

public void ConfigureAuth(IAppBuilder app) 
    { 
     // Enable the application to use a cookie to store information for the signed in user 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login") 
     }); 
     // Use a cookie to temporarily store information about a user logging in with a third party login provider 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 


    } 

// Bu çıkış kodudur

public ActionResult LogOff () 
    { 
     //Delete all cookies while user log out 
     string[] myCookies = Request.Cookies.AllKeys; 
     foreach (var cookies in myCookies) 
     { 
      Response.Cookies[ cookies ].Expires = DateTime.Now.AddDays(-1); 

     } 
     Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie); 

     // AuthenticationManager.SignOut(); 
     Session.Clear(); 
     Session.RemoveAll(); 
     Session.Abandon(); 
     return RedirectToAction("LoginPage", "Account"); 
    } 

// Bu Bu tasarım gereğidir

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await UserManager.FindAsync(model.UserName, model.Password); 
      if (user != null) 
      { 
       await SignInAsync(user, model.RememberMe); 
       return RedirectToLocal(returnUrl); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Invalid username or password."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

cevap

2

benim giriş kontrolörü kodudur . Birden çok tarayıcıda oturum açmanıza ve yalnızca diğer tüm tarayıcıları değil "çıkış yap" ı tıklattığınız tarayıcıda oturum açmanıza izin verin.

Ancak oturum açma sırasında kullanıcı üzerinde SecurityStamp güncelleştirebilir ve güvenlik damgası doğrulama süresini çok düşük bir süre için ayarlayabilirsiniz.

Bu güvenlik damga değişecek:

await userManager.UpdateSecurityStampAsync(user.Id); 

sizin çıkış yönteminde bu koydu.

Ve içinde

senin Startup.Auth.cs bu şekilde UseCookieAuthentication değiştirin:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
    LoginPath = new PathString("/Account/Login") 
    Provider = new CookieAuthenticationProvider 
    { 
     // Enables the application to validate the security stamp when the user logs in. 
     // This is a security feature which is used when you change a password or add an external login to your account. 
     OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
      validateInterval: TimeSpan.FromMinutes(1), // set this low enough to optimise between speed and DB performance 
      regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)), 
    } 
});    

bu yaklaşımla tek dezavantajı - çıkış prosedürü yürütülmez - hiçbir şey olmuyor. Ve çıkış olduğunda, diğer tüm oturumları günlüğe kaydeder.