2013-07-25 94 views
0

在我的ASP.net MVC項目中,我有(和其他角色)版主和用戶。我想讓主持人選擇「以用戶身份查看當前頁面」。模擬一個請求(Asp.net MVC)

我的方法是創建一個ActionFilterAttribute和超載OnActionExecuting & OnResultExecuted的頁面,然後呈現給定用戶。

第一個想法有一個與角色變戲法:

OnActionExecuting { 
    ... //various checks, if role exist, if user want to switch 
    var tempRoles = Roles.getRolesForUser(user); 
    filterContext.HttpContext.Items["tempRole"] = tempRoles; 
    Roles.RemoveUserFromRoles(user, tempRoles) 
    Roles.AddUserToRole(user, targetRole); 
} 

然後

OnResultExecuted { 
//if switched view 
{ 
    Roles.RemoveUserFromRole(user,targetRole) 
    Roles.AddUserToRoles(filterContext.HttpContext.Items["tempRole"]) 
} 

這工作,但在最壞的情況下的角色都沒有了,所以我寧願不觸摸他們...

我的第二個想法是創建一個虛擬用戶添加他到userroles簽署主持人進入這個帳戶與FormsAuthentication.SetAuthCookie(dummyUser,真),並恢復e OnResultExecuted,所以在最壞的情況下,用戶處於dummyRole(他可以註銷)並且dummyUser位於數據庫中。

經過調試和研究後,我意識到SetAuthCookie需要重定向才能生效 - 所以它不能以這種方式工作。

的問題:

  • 有沒有辦法迫使SetAuthCookie接觸到沒有重定向
  • 任何其他建議影響/方法如何做到這一點「看到其他用戶頁面」?
  • 如果我的第一個想法是唯一的解決方案,我該如何使它萬無一失?

回答

1

AHO​​I基督教,

你可以裝飾類SqlRoleProvider並將其添加到角色管理器。

看樣角色的提供者實現: http://msdn.microsoft.com/en-us/library/tksy7hd7%28v=vs.100%29.aspx

裝飾SqlRoleProvider可以覆蓋的isUserInRole方法,從而實現模擬功能。

編輯:我已經添加下面的代碼:

public class MyRoleProvider : SqlRoleProvider 
{ 
    private static ConcurrentDictionary<string, string> impersonationList; 

    public MyRoleProvider() : base() 
    { 
     impersonationList = new ConcurrentDictionary<string, string>(); 
    } 

    public static void startImpersonate(string username, string rolename) 
    { 
     impersonationList.TryAdd(username,rolename); 
    } 

    public override string[] GetRolesForUser(string username) { 
     if (impersonationList.ContainsKey(username)) 
      return new string[] { impersonationList[username] }; 
     else 
      return base.GetRolesForUser(username); 
    } 

    public static void stopImpersonate(string username) 
    { 
     string rolename; 
     impersonationList.TryRemove(username, out rolename); 
    } 
}