0

私の 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"])
}

これは機能しますが、最悪のシナリオでは役割がなくなっているので、私はそれらに触れないことを好みます...

私の 2 番目のアイデアは、ダミー ユーザーを作成し、彼を userroles に追加し、FormsAuthentication.SetAuthCookie(dummyUser, true) を使用してモデレーターをこのアカウントにサインインさせ、OnResultExecuted のすべてを元に戻すことでした。彼はログアウトできます)、dummyUser はデータベースにあります。

デバッグと調査の後、SetAuthCookie を有効にするには Redirect が必要であることに気付きました。そのため、この方法では機能しません。

質問:

  • リダイレクトせずに SetAuthCookie を強制的に有効にする方法はありますか
  • この「他のユーザーとしてページを見る」を達成するための他の提案/アプローチはありますか?
  • 私の最初のアイデアが唯一の解決策である場合、どうすれば誰でも簡単に解決できますか?
4

1 に答える 1

1

アホイ・クリスチャン、

クラス 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);
    }
}
于 2013-07-25T12:01:48.280 に答える