35

アクションメソッドがあります

[Authorize(Roles="Admin")]
public ActionResult EditPosts(int id)
{
    return View();
}

私の場合、投稿を編集できるように管理者を承認する必要がありますが (ここがクールな部分です)、投稿の作成者が通常のユーザーである投稿を編集できるようにする必要もあります。では、投稿を作成したユーザーと管理者を除外し、他のユーザーを許可しないようにするにはどうすればよいでしょうか? PostEntry id をルート パラメーターとして受け取っていますが、それは属性の後であり、属性は定数パラメーターのみを受け入れます。非常に難しいもののように見えます。あなたの答えは高く評価されています。乾杯!

4

2 に答える 2

72

カスタム認証属性を書くことができます:

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;
        if (user.IsInRole("Admin"))
        {
            // Administrator => let him in
            return true;
        }

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["id"] as string;
        if (string.IsNullOrEmpty(id))
        {
            // No id was specified => we do not allow access
            return false;
        }

        return IsOwnerOfPost(user.Identity.Name, id);
    }

    private bool IsOwnerOfPost(string username, string postId)
    {
        // TODO: you know what to do here
        throw new NotImplementedException();
    }
}

そして、コントローラーアクションをそれで飾ります:

[AuthorizeAdminOrOwnerOfPost]
public ActionResult EditPosts(int id)
{
    return View();
}
于 2012-07-15T17:30:43.130 に答える