2013-06-29 11 views
9

Ich habe eine Anforderung in einer MVC 4-Anwendung und ich war nicht zu erfolgreich bei der Suche nach viel Informationen überall.MVC 4 - Benutzeridentitätswechsel

Ich muss in der Lage sein, einen anderen registrierten Benutzer zu "imitieren". In der Regel wäre dies ein Kundendienstbenutzer, der einen anderen Benutzer im System "imitieren" könnte.

Dies ist nicht Windows Identität Identitätswechsel.

Ich brauche keine Hilfe mit Sicherheit oder Berechtigungen, nur mit der Möglichkeit, sich anzumelden und dann einen anderen Benutzer auswählen, um die Website als zu surfen.

Gedanken?

Vielen Dank im Voraus.

+1

Welche Art von Authentifizierung verwenden Sie? –

+0

Authentifizierung mit Standardformularen, die mit MVC –

+0

Okey geliefert wird. Das kommt mir in den Sinn, ich könnte mich irren. Wenn Sie sich authentifizieren, erstellen Sie ein Cookie auf dem Benutzer-PC. Wenn Sie einen anderen Benutzer "imitieren", schreiben Sie zusätzliche Informationen zu diesem Cookie. Wenn Sie diesen Cookie in Ihrer Anwendung lesen, überprüfen Sie zunächst dieses zusätzliche Feld (dies könnte der Benutzername eines anderen Benutzers sein). Wenn es vorhanden ist, können Sie das HtppContext-Objekt mit anderen Benutzerinformationen füllen. Auf diese Weise können Sie die Site als anderen Benutzer anzeigen. Wie ich jedoch gesagt habe, bin ich mir nicht sicher, ob das funktioniert. Oder sogar sicher. –

Antwort

1

Wir verwenden die folgende Art und Weise mit unserer Benutzerauthentifizierung auf MVC 5: Wo Benutzer unsere Tabelle mit Benutzern sind

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

so können Sie diesen einen haben auch

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

so in unser Controller haben wir dies zur Authentifizierung des Benutzers

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

und dann in y unsere Erfolgsmethode

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