阻止用户在“编辑”操作方法中更改参数ID

时间:2015-04-29 16:34:14

标签: asp.net asp.net-mvc authorization

因此,我在编辑/详细信息方法上的网址会显示http://localhost:1234/Movies/Edit?ID=3。如果db表包含属于其他人的记录,例如1,2,4,5,6。没有什么能阻止用户直接输入和访问说记录6(例如/ Movie / Edit / 6)。

如何防止这种情况发生?

        // GET: /Movie/Edit/id
    public ActionResult Edit(int id = 0)
    {
        Movie movie = db.Movies.Find(id);
        if (movie == null)
        {
            return HttpNotFound();
        }
        return View(movie);
    }

    //
    // POST: /Movie/Edit/id
    [HttpPost]
    public ActionResult Edit(Movie movie)
    {
        if (ModelState.IsValid)
        {
            db.Entry(movie).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(movie);
    }

1 个答案:

答案 0 :(得分:0)

这真的取决于你想要限制的内容以及你希望他们限制编辑权限的人,因此我将给出一个通用的答案。您可以为每种方法或整个班级申请授权。您可以使用[Authorize]

为所有注册用户或具有特定角色的用户提供一般授权

通用授权(必须注册并登录):

    // GET: /Movie/Edit/id
    [Authorize]
    public ActionResult Edit(int id = 0)
    {
        Movie movie = db.Movies.Find(id);
        if (movie == null)
        {
           return HttpNotFound();
        }
         return View(movie);
    }

     //POST: /Movie/Edit/id
    [HttpPost]
    [Authorize]
    public ActionResult Edit(Movie movie)
    {
        if (ModelState.IsValid)
        {
            db.Entry(movie).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(movie);
    }

基于滚动的授权(您可以设置它,以便任何用户都可以说“管理员”角色只能访问这些方法):

        // GET: /Movie/Edit/id
        [Authorize(Role="Admin")]
        public ActionResult Edit(int id = 0)
        {
            Movie movie = db.Movies.Find(id);
            if (movie == null)
            {
               return HttpNotFound();
            }
             return View(movie);
        }

         //POST: /Movie/Edit/id
        [HttpPost]
        [Authorize(Role="Admin")]
        public ActionResult Edit(Movie movie)
        {
            if (ModelState.IsValid)
            {
                db.Entry(movie).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(movie);
        }