我正在內容管理系統上工作,其中有一個控制器顯示分配給當前登錄用戶的所有文章以供他審閱,然後用戶可以批准或拒絕這篇文章。爲了確保用戶只能看到分配給他的文章中,我寫了下面的查詢: -對控制器操作方法執行自定義授權檢查
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和更改文章編號,以他的一篇文章沒有分配給他,然後他可以批准或拒絕它;所以我編輯的操作方法
[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);} } }