【问题标题】:Performing custom authorization check on the controller action methods对控制器操作方法执行自定义授权检查
【发布时间】: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);} 
    }
}

所以我有以下三个问题:-

  1. 控制器级别的检查是否会阻止用户修改 URL 并访问不是他分配给他的文章

  2. 我是否应该在编辑操作方法的 POST 版本上也添加以下检查(除了 GET 版本),否则将被视为不必要的检查?

    if (!articleapproval.Isapproval(User.Identity.Name)) 
        return View(“InvalidOwner”);
    
  3. 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


    【解决方案1】:

    控制器级别的检查是否会阻止用户修改 URL 和访问他不是分配给他的文章

    是的

    我是否应该在编辑操作的 POST 版本中添加以下检查 方法也(除了 GET 版本),否则将被考虑 作为不必要的检查?

    你应该同时检查 GET 和 POST

    最好将 User.Identity.Name 传递给辅助方法(如 我目前正在做)?或修改辅助方法以生成 里面的User.Identity.Name如下?

    帮助方法不需要知道如何检索当前用户的名字。你的实现很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      相关资源
      最近更新 更多