1

一部のユーザーが他のユーザーとしてプロキシすることを許可するサイトがあります。そうすれば、サイト全体が、自分がプロキシしているユーザーであるかのように見えるはずです。これを行うには、現在のユーザー オブジェクトを変更します

internal static void SetProxyUser(int userID)
{
    HttpContext.Current.User = GetGenericPrincipal(userID);
}

このコードは私にとってはうまくいきます。

サイトでは、プロキシするために、ユーザーはドロップダウンで値を選択し、それを _layout ファイルでそのままレンダリングして、すべてのページに表示します。

 @Html.Action("SetProxyUsers", "Home")

SetProxyUsers ビューは次のようになります。

@using (@Html.BeginForm("SetProxyUsers", "Home")) {

@Html.DropDownList("ddlProxyUser", (SelectList)ViewBag.ProxyUsers_SelectList, new { onchange = "this.form.submit();" })

}

このためのコントローラー アクションは次のようになります。

    [HttpGet]
    public ActionResult SetProxyUsers()
    {
        ViewBag.ProxyUsers_SelectList = GetAvailableProxyUsers(originalUserID);

        return PartialView();
    }

    [HttpPost]
    public ActionResult SetProxyUsers(FormCollection formCollection)
    {
        int id = int.Parse(formCollection["ddlProxyUser"]);

        RolesHelper.SetProxyUser(id);

        ViewBag.ProxyUsers_SelectList = GetAvailableProxyUsers(originalUserID);

        return Redirect(Request.UrlReferrer.ToString());
    }

これはすべて機能します (次にやりたいことを象徴するためにここに入れている originalUserID 変数を除いて)。

私の問題は、ドロップダウン リストの値がログイン ユーザーに基づいていることです。したがって、プロキシを使用してユーザーを変更するときは、プロキシ ドロップダウン リストの値も変更します (「新しい」ユーザーがプロキシを許可されていない場合は非表示にするか、「新しい」ユーザーの使用可能なプロキシ ユーザーのリストを表示します)。 )。

この選択リストを変更しないでおく必要があります。元のユーザーの ID を保存するにはどうすればよいですか? セッション変数に保存することもできますが、潜在的なタイムアウトの問題を台無しにしたくないので、これは最後の手段です。

助けてください。質問に不明な点がある場合はお知らせください。

アップデート

HttpContext投稿ごとに が設定されていることに気づきませんでした。私はこれまでこの種の作業を実際に行ったことがなく、何らかの理由でセッション全体の値を設定していると思い込んでいました (ばかです、私は知っています)。ただし、Windows認証を使用しています。ユーザーをより永続的に (ブラウザが開いている限り) 変更するにはどうすればよいですか? Windows を認証モードとして使用しているため、FormAuthentication Cookie を使用できないと思いますよね?

4

2 に答える 2

2

認証を偽造する代わりに、それを本物にしてみませんか? 私が取り組んでいるサイトでは、ユーザーが偽装されるように認証 Cookie を設定することで、管理者が他のユーザーになりすますことができます。次に、元のユーザー ID がセッションに保存されるため、偽装されたユーザー アカウントからログアウトした場合、実際には元のアカウントに自動的に再度ログインします。

編集

偽装を行う方法のコードサンプルは次のとおりです。

[Authorize] //I use a custom authorize attribute; just make sure this is secured to only certain users.
public ActionResult Impersonate(string email) {
    var user = YourMembershipProvider.GetUser(email);

    if (user != null) {
        //Store the currently logged in username in session so they can be logged back in if they log out from impersonating the user.
        UserService.SetImpersonateCache(WebsiteUser.Email, user.Email);

        FormsAuthentication.SetAuthCookie(user.Email, false);
    }

    return new RedirectResult("~/");
}

そのような単純な!それはうまくいっています。唯一のトリッキーな部分は、セッション データを保存することです (これは確かに必須ではありません。これは、ユーザーが常に自分自身としてログインし直す必要がないように、ユーザーに提供する優れた機能でした)。私が使用しているセッションキーは次のとおりです。

string.Format("Impersonation.{0}", username)

偽装されているユーザーusernameの名前はどこにありますか(そのセッション キーの値は、元のユーザー/管理者ユーザーのユーザー名です)。これは重要です。ログアウトが発生したときに、「ねえ、偽装キーはありますか?もしあれば、セッションに保存されているそのユーザーとしてログインします。そうでない場合は、ただログアウトします」。

LogOff メソッドの例を次に示します。

[Authorize]
public ActionResult LogOff() {
    //Get from session the name of the original user that was logged in and started impersonating the current user.
    var originalLoggedInUser = UserService.GetImpersonateCache(WebsiteUser.Email);

    if (string.IsNullOrEmpty(originalLoggedInUser)) {
        FormsAuthentication.SignOut();
    } else {
        FormsAuthentication.SetAuthCookie(originalLoggedInUser, false);
    }

    return RedirectToAction("Index", "Home");
}
于 2012-06-14T19:27:00.533 に答える
0

この記事http://www.codeproject.com/Articles/43724/ASP-NET-Forms-authentication-user-impersonationのコメントにある mvc の例を使用して、

FormsAuthentication.SetAuthCookie() を使用して、現在の承認済み Cookie を変更するだけでなく、偽装されたユーザー ID を Cookie に保存します。このようにして、元のユーザーに簡単に再認証できます。

私はそれを非常に迅速に機能させました。これを使用して、管理者が他のユーザーとしてログインできるようにします。

于 2012-06-14T19:58:31.573 に答える