对控制器操作方法执行自定义授权检查
本文关键字:授权 检查 自定义 执行 控制器 操作方法 | 更新日期: 2023-09-27 18:21:21
我正在开发一个内容管理系统,在该系统中,我有一个控制器,可以显示分配给当前登录用户供其审阅的所有文章,然后用户可以批准或拒绝这篇文章。为了确保用户只看到分配给他的文章,我写了以下查询:-
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
传递给helper方法(就像我目前正在做的那样)有什么更好的方法?或者修改helper方法以在其内部生成User.Identity.Name
,如下所示?public partial class Article { public bool Isapprova () { return HostedBy.Equals(User.Identity.Name, StringComparison.OrdinalIgnoreCase);} } }
控制器级别的检查是否会阻止用户修改URL和访问他不是指定的文章
是
我应该在POST版本的编辑操作上添加以下检查吗方法(除了GET版本之外),否则将考虑作为不必要的检查?
您应该同时检查GET和POST
将User.Identity.Name传递给helper方法(作为我目前正在做)?或者修改helper方法以生成User.Identity.Name如下?
helper方法不需要知道如何检索当前用户名。您的实现很好。