2015-09-30 16 views
5

Sto usando l'identità di asp.net 2.0 per l'autenticazione (middleware Owin) nella mia applicazione. Sessione di sequestro: Quando eseguo il login Identity crea AspNet.ApplicationCookie.then, ho copiato il valore AspNet.ApplicationCookie.Quando ho disconnesso dall'applicazione.Dopo il logout, sto creando manualmente i cookie (AspNet.ApplicationCookie) e faccio un aggiornamento Reindirizza me home page.Privilege Escalation e Session Hijacking in Identity MVC5

Privilege Escalation: Allo stesso tempo, mi sono collegato come AI utente copiato (AspNet.ApplicationCookie) il suo biscotto e mi sono collegato out.After mi sono collegato come utente di BI sono l'editing l'utente B cookie e l'utente incollato A cookie e salvato. Dopo aver aggiornato il browser, posso ottenere l'accesso e l'autenticazione UserA.

Sto cancellando tutta la sessione ed elimini tutti i cookie quando ho effettuato il logout.Anche l'identità Asp.Net (Owin) genera nuovo AspNet.ApplicationCookie ogni volta. Ma accetta ancora i vecchi cookie e mi concede un accesso .Non so perché? Qualcuno può darmi come invalidare il vecchio AspNet.ApplicationCookie dopo la disconnessione. Questo è il mio codice in Startup.Auth.cs

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); 


    } 

// Questo è il codice di logout

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"); 
    } 

// Questo è il mio codice di controllo di accesso

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); 
    } 

risposta

2

Questo legato alla progettazione . Consentendo l'accesso da più browser e la disconnessione solo nel browser in cui si è fatto clic sulla "disconnessione" e non su tutti gli altri browser.

Ma alla disconnessione è possibile aggiornare SecurityStamp sull'utente e quindi impostare il periodo di convalida del timbro di sicurezza per un periodo di tempo molto basso.

Questo cambierà timbro di sicurezza:

await userManager.UpdateSecurityStampAsync(user.Id); 

mettere questo nel metodo logout.

E nel tuo Startup.Auth.cs modificare UseCookieAuthentication in questo modo:

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)), 
    } 
});    

L'unico svantaggio di questo approccio - quando procedura di disconnessione non viene eseguita - non succede nulla. E quando si verifica il logout, si disconnettono tutte le altre sessioni.

Problemi correlati