1

こんにちは、同じユーザーまたは管理者がアクセスできるコントローラーのアクション メソッドに承認フィルターを配置したいと考えています。

ユーザー Alex が私の Web サイトに登録し、プロファイルを編集したいとします。そのため、他のユーザーではなく自分のプロファイルのみを編集できるようにするか、管理者が全員のプロファイルを編集する権限を持つようにする必要があります。

Authorize 属性に管理者としてロールを追加できますが、セルフ ユーザーの問題に取り組む方法を教えてください。親切に助けて

[Authorize(Roles="admin")]
4

2 に答える 2

4

これは、ユーザー名 (GUID またはその他の方法) がルートに渡されたパラメーターと一致するかどうかを確認し、管理者のユーザー ロールを確認する承認フィルターの例です。

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!httpContext.User.Identity.IsAuthenticated)
            return false;  // if user not Authenticated, do not allow

        string userName = filterContext.HttpContext.User.Identity.Name;
        string id = filterContext.RouteData.Values[this.RouteParameter];

        If (userName == id)
            return true;  // assuming paramter passed matches username, allow
        else if (filterContext.HttpContext.User.IsInRole( "Admin" ) || IsOwner( filterContext ))
            return true;  // if user has role Admin, allow


        return true;
    }
}

これはテストされておらず、ニーズを解決する以上のことを導くことを目的としていますが、実装に近づくと思います.

その間、私はあなたのアプローチに私の2セントを追加したいと思います:

私は、同様のチェックを行い、ユーザーを自分のページまたは警告ページにリダイレクトするアクション フィルターをより支持します。私は Authorization Filter が提供するセキュリティを高く評価していますが、かなり鈍いように感じます。私は、より洗練されたユーザー エクスペリエンスを提供するアクセス許可ベースのセキュリティとソフト リダイレクトを好みます。

于 2013-02-16T05:21:02.477 に答える
0

これは、そのユーザーのみが自分のパスワードを変更できるように、パスワードの変更で行う方法です。

私のアカウントコントローラーで

    //
    // GET: /Account/ChangePassword
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }

    //
    // POST: /Account/ChangePassword
    [Authorize]
    [HttpPost]
    public ActionResult ChangePassword(ChangePasswordModel model)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
                return RedirectToAction("ChangePasswordSuccess");
            else
                ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

次に、私の in _Layoutで、このように宣言して、そのユーザーのみがその ActionLink を表示して開き、自分のパスワードを変更できるようにします

@if (HttpContext.Current.User.Identity.IsAuthenticated)
   {
    <li>@Html.ActionLink("Change Password", "ChangePassword", "Account")</li>                     
   }

これがあなたにも役立つことを願っています..乾杯。:)

于 2013-02-19T03:04:55.293 に答える