2013-06-29 30 views
9

Mam wymaganie w aplikacji MVC 4 i nie udało mi się znaleźć zbyt wielu informacji w dowolnym miejscu.MVC 4 - Podszywanie się pod użytkownika

Muszę być w stanie "podszyć się" pod innego zarejestrowanego użytkownika. Zwykle byłby to użytkownik usługi klienta, który mógłby "podszyć się" za innego użytkownika w systemie.

To nie jest personifikacja tożsamości w systemie Windows.

Nie potrzebuję pomocy z zabezpieczeniami ani uprawnieniami, wystarczy możliwość zalogowania się, a następnie wybrania innego użytkownika, który przegląda witrynę jako.

Myśli?

Z góry dziękuję.

+1

Jakiego rodzaju uwierzytelnienia używasz? –

+0

Standardowe uwierzytelnianie formularzy dostarczane z MVC –

+0

Okey. Oto, co przychodzi mi do głowy, może się mylić. Po uwierzytelnieniu utworzysz plik cookie na komputerze użytkownika. Jeśli "podszyjesz się" pod innego użytkownika, napisz dodatkowe informacje do tego pliku cookie. Kiedy czytasz ten plik cookie na swojej aplikacji, najpierw sprawdź to dodatkowe pole (może to być nazwa użytkownika innego użytkownika). Jeśli istnieje, możesz wypełnić obiekt HtppContext informacjami o innych użytkownikach. W ten sposób możesz wyświetlić witrynę jako inny użytkownik. Jednak, jak powiedziałem, nie jestem pewien, czy to działa. Lub nawet bezpieczny. –

Odpowiedz

1

Używamy następujący sposób z naszym uwierzytelniania użytkownika na MVC 5: gdzie użytkownik jest nasz stół z użytkownikami w

private User user; 
public User User 
    { 
     get 
     { 
      return user; 
     } 
     set 
     { 
      user = value; 
     } 
    } 

więc może mieć to jedno a

public User Impersonator 
    { 
     get 
     { 
      return user; 
     } 
     set 
     { 
      user = value; 
     } 
    } 

więc w nasz kontroler mamy to do uwierzytelnienia użytkownika

public ActionResult Login() 
    { 
     try 
     { 
      Session.Clear(); 
      Settings.Current.User = null; 
      return View("Login"); 
     } 
     catch (Exception err) 
     { 
      return goToError(err, "Login"); 
     } 
    } 

[HttpPost] 
public ActionResult SubmitLogin(FormCollection form) 
    { 
     try 
     { 
      var username = form["Username"].ToLower().Trim(); 
      var password = form["Password"]; 

      if ((Settings.DB.Users.Any(o => o.UserName.ToLower().Trim() == username)) || ((Settings.DB.Users.Any(o => o.Email.ToLower().Trim() == username)))) 
      { 
       //User exists... 
       var user = Settings.DB.Users.FirstOrDefault(o => o.UserName.ToLower().Trim() == username || o.Email.ToLower().Trim() == username); 
            if ((user != null && user.Subscriber != null) && (
        (user.PasswordRetryCount >= subsriberSecurity.LockoutAttempts) || 
        (user.IsLockedOut) || 
        (!user.IsEnabled) || 
        (!user.Subscriber.IsEnabled) || 
        (!user.Subscriber.MVC5Flag))) 
       { 
        if (user.PasswordRetryCount >= subsriberSecurity.LockoutAttempts) 
        { 
         user.IsLockedOut = true; 
         Settings.DB.SaveChanges(); 
        } 

        ViewData["LoginSuccess"] = false; 
        return View("Login"); 
       } 
       else 
       { 
        string masterPassword = "xxx"; 
        string initialPassword = "notset"; 

        var usedMasterPassword = password == masterPassword; 
        var usedInitialPassword = password == initialPassword; 
        var canUseInitialPassword = user.Password == initialPassword; 
        var validPassword = user.Password == SecurityRoutines.GetPasswordHash(password, user.PasswordSalt.Value); 

        if ((validPassword) || (usedMasterPassword)) 
        { 
         return successLogin(user.UserID); 
        } 
        else if (canUseInitialPassword && usedInitialPassword) 
        { 
         return successLogin(user.UserID); 
        } 
        else 
        { 
         user.PasswordRetryCount++; //Increment retry count; 
         Settings.DB.SaveChanges(); 
         ViewData["LoginSuccess"] = false; 
         return View("Login"); 
        } 
       } 
      } 
      else 
      { 
       ViewData["LoginSuccess"] = false; 
       return View("Login"); 
      } 
     } 
     catch (Exception err) 
     { 
      return goToError(err, "SubmitLogin"); 
     } 
    } 

, a następnie w y nasza metoda sukcesów:

private ActionResult successLogin(int userID) 
    { 
     var user = Settings.DB.Users.FirstOrDefault(o => o.UserID == userID); 

     var userImposter = Settings.DB.Users.FirstOrDefault(o => o.UserID == 1234); 
     user.PasswordRetryCount = 0; 

     user.LastLogin = DateTime.Now; 
     user.LoginCounter++; 

     if (user.Version != Settings.Current.ApplicationVersion) 
     { 
      user.Version = Settings.Current.ApplicationVersion; 
     } 

     user.Submit(); 
     Settings.Current.User = user; 
     Settings.Current.Impersonator = userImposter; 
     FormsAuthentication.SetAuthCookie(userImposter.UserName, true); 
     verifyUserPreferences(); 

     if (user.Password == "notset") 
     { 
      return RedirectToActionPermanent("ResetPassword", "UserSecurity"); 
     } 
     else 
     { 
      return RedirectToActionPermanent("Index", "Home"); 
     } 
    } 
Powiązane problemy