【发布时间】:2012-01-25 23:55:25
【问题描述】:
我正在开发一个内容管理系统,其中我有一个控制器来显示分配给当前登录用户的所有文章以供他查看,然后用户可以批准或拒绝这篇文章。为了确保用户只看到分配给他的文章,我编写了以下查询:-
public IQueryable<Article> MyApproval()
{
Guid id = (Guid)Membership.GetUser().ProviderUserKey;
return from article in db.Articles
where article.Approval_ID == id && article.Article_status_ID == 1 // 1 represents new articles in Article_status table
orderby article.Article_ID descending
select article;
}
但我发现用户可能会手动修改URL并将文章ID更改为他没有分配的文章,然后他可以批准或拒绝它;所以我在编辑操作方法之前添加了以下检查
[Authorize]
public ActionResult Edit(int id)
{
Article articleapproval = articletyperepository.GetArticle(id);
if (!articleapproval.Isapproval(User.Identity.Name))
return View(“InvalidOwner”);
else
{
articleapproval.Published_Date = DateTime.Now;
return View(articleapproval);}
}
}
所以我有以下三个问题:-
控制器级别的检查是否会阻止用户修改 URL 并访问不是他分配给他的文章
-
我是否应该在编辑操作方法的 POST 版本上也添加以下检查(除了 GET 版本),否则将被视为不必要的检查?
if (!articleapproval.Isapproval(User.Identity.Name)) return View(“InvalidOwner”); -
将
User.Identity.Name传递给辅助方法更好(就像我目前正在做的那样)?或者修改辅助方法以在其中生成User.Identity.Name,如下所示?public partial class Article { public bool Isapprova () { return HostedBy.Equals(User.Identity.Name, StringComparison.OrdinalIgnoreCase);} } }
【问题讨论】:
标签: c# asp.net asp.net-mvc-3 entity-framework