2015-09-30 45 views
5

Używam asp.net identity 2.0 do uwierzytelniania (Owin middleware) w mojej aplikacji. Przejęcie sesji: Kiedy się loguję Tożsamość tworzy AspNet.ApplicationCookie.then skopiowałem AspNet.ApplicationCookie value.Then i wylogowałem się z aplikacji. Po Logout, ręcznie tworzę ciasteczko (AspNet.ApplicationCookie) i robię odświeżenie To przekierowuje ja strona główna.Eskalacja uprawnień i przejmowanie sesji w tożsamości MVC5

Privilege Escalation: Jednocześnie Zalogowałem się jako AI użytkownika kopiowane (AspNet.ApplicationCookie) jego ciasteczka i zalogowałem out.After Zalogowałem się jako użytkownik BI jestem edycji użytkownik B Cookie i wklejony Użytkownik A cookie i go zapisałem. Po odświeżeniu przeglądarki mogę uzyskać dostęp i uwierzytelnianie UserA.

Usuwam wszystkie sesje i usuwam wszystkie pliki cookie Po wylogowaniu. Nawet tożsamość Asp.Net (Owin) generuje nowe AspNet.ApplicationCookie za każdym razem.Ale nadal akceptuje stare ciasteczka i daje mi dostęp . Nie wiem dlaczego? Czy ktoś może mi dać unieważnić stary AspNet.ApplicationCookie po wylogowaniu. To jest mój kod w 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); 


    } 

// To jest kod wylogowania

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

// To jest mój login kod kontrolera

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

Odpowiedz

2

Jest to zgodne z projektem . Umożliwienie logowania się z wielu przeglądarek i wylogowywanie się tylko w przeglądarce, w której kliknąłeś "wylogowanie", a nie wszystkie inne przeglądarki.

Po wylogowaniu można zaktualizować użytkownika SecurityStamp, a następnie ustawić okres sprawdzania poprawności zabezpieczeń na bardzo krótki czas.

to zmieni pieczęć bezpieczeństwa:

await userManager.UpdateSecurityStampAsync(user.Id); 

umieścić to w swoim sposobie wylogowania.

iw swoim Startup.Auth.cs modyfikować UseCookieAuthentication w ten sposób:

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

Jedyną wadą tego podejścia - gdy procedura wylogowania nie jest wykonywana - nic się nie dzieje. A kiedy się wyloguje, wylogowuje wszystkie inne sesje.