2013-06-29 4 views
9

私はMVC 4アプリケーションで要件を満たしており、どこでも多くの情報を見つけることができませんでした。MVC 4 - ユーザーなりすまし

私は別の登録ユーザーを "偽装"できる必要があります。典型的には、これは、顧客サービスのユーザであり、システム内の別のユーザを「偽装する」ことができます。

これはWindows IDの偽装ではありません。

私はセキュリティやアクセス許可に関しては助けが必要ではありません。ログインして別のユーザーを選んでサイトをサーフィンするだけです。

思考?

ありがとうございます。ユーザーは、ユーザーと私たちのテーブルには

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

である場合ので、あなたは

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

そうでも、このいずれかを持つことができ :

+1

どのような認証方法を使用していますか? –

+0

MVC付属の標準フォーム認証 –

+0

Okey。これは私の心に来るものです、私は間違っているかもしれません。認証すると、ユーザーpcにCookieを作成します。別のユーザーを「偽装」する場合は、このCookieに追加情報を書き込んでください。アプリケーションでこのCookieを読み取るときは、最初にこの追加フィールド(他のユーザーのユーザー名)を確認してください。存在する場合は、HtppContextオブジェクトを他のユーザー情報で埋め込むことができます。この方法で、他のユーザーとしてサイトを表示できます。しかし、私が言ったように、私はこれがうまくいくかどうか分からない。または安全にしてください。 –

答えて

1

は、我々はMVC 5に、当社のユーザー認証と、次の方法を使用します私たちのコントローラは、ユーザを認証するためにこれを持っています。

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

そしてy成功の方法

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"); 
     } 
    } 
関連する問題