1

假设我们有一个 ASP.NET MVC 博客应用程序,它允许用户注册然后在网站上写博客。现在让我们假设博客编辑页面接收 blogId,然后呈现与博客相关的信息。在 action 方法中如何保证 action 方法接收到的 BlogId 是登录用户创建的呢?我们可以有这样一个场景,有人可以修改 URL 并为不属于登录用户的博客输入一个 ID。防止这种情况的最佳方法是什么?

我能想到的一种选择是在 action 方法中获取博客的创建者,然后根据登录用户的 ID 检查它,以确保用户有权编辑该特定博客。这可以通过某种过滤器来实现,而不必在操作方法中指定吗?

4

1 回答 1

2

这可以通过某种过滤器来实现,而不必在操作方法中指定吗?

当然。您可以编写自定义授权属性:

public class AuthorizeBlogPostOwnerAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            return false;
        }

        var user = httpContext.User;

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["postid"] as string;
        if (string.IsNullOrEmpty(id))
        {
            return false;
        }

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

    private bool IsOwnerOfPost(string username, string postId)
    {
        // hit your dabatase here and validate if the current user
        // is owner of the blog post
        throw new NotImplementedException();
    }
}

可以用来装饰你的控制器动作:

[AuthorizeBlogPostOwner]
public ActionResult SomeAction(string postId)
{
    ... if we got that far it means that the current user is owner of the blog post
}
于 2013-09-18T10:55:02.390 回答