让我们假设我们有一个ASP.NET MVC博客应用程序,允许用户在网站上注册然后博客。现在让我们假设博客编辑页面接受blogId,然后呈现与博客相关的信息。在action方法中,我们如何确保action方法接收的BlogId是登录用户创建的BlogId?我们可以有一个场景,有人可以修改URL并为不属于登录用户的博客添加ID。防止这种情况的最佳方法是什么?
我能想到的一个选项是在动作方法中获取博客的创建者,然后根据登录用户的ID对其进行检查,以确保用户有权编辑该特定博客。这可以通过某种过滤器来实现,而不必在动作方法中指定它吗?
答案 0 :(得分:2)
这可以通过某种过滤器而不是必须实现 在action方法中指定它?
当然。您可以编写自定义授权属性:
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
}