我应该先检查身份验证还是ModelState.IsValid

时间:2017-02-27 12:02:17

标签: c# .net asp.net-mvc asp.net-identity modelstate

我有一个.NET MVC5网站,用户使用Microsoft Identity登录。我有多个表单帖子,用于在网站上添加和编辑项目。我想知道我应该在哪个订单中进行验证: -

  • ModelState.IsValid,然后是User.Identity.IsAuthenticated
  • User.Identity.IsAuthenticated then ModelState.IsValid

我目前有以下代码可以使用,但似乎是鸡和蛋的情况': -

var user = UserAccountFunctions.GetUser(User);
if (user != null)
{
    ClientProfile profile = ClientProfile.GetUser(user.Id, db);

    if (profile != null)
    {
        if (ModelState.IsValid)
        {
            // Do logic here
        }
    }
}

在检查身份验证之前,我应该先交换此代码以检查模型,以便我有: -

if (ModelState.IsValid)
{
    var user = UserAccountFunctions.GetUser(User);
    if (user != null)
    {
        ClientProfile profile = ClientProfile.GetUser(user.Id, db);

        if (profile != null)
        {

            // Do logic here...
        }
    }
}

或者这里没有区别吗?我在整个网站上重复了这段代码,所以寻找哪个更好的选择?我目前使用的是顶级的,因为我觉得除非经过身份验证,否则你不应该尝试检查模型吗?

这里有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是更新用户电子邮件的示例:

            [AcceptVerbs(HttpVerbs.Post)]
            [Authorize]
            [ValidateAntiForgeryToken()]
            public ActionResult emailupdate(UserEmailEditModel editmodel_post)
            {   
                if (!ModelState.IsValid)
                {   
                  // redirect to email view and show errors
                }

                // check if posted id is the same as stored in session
                if (User.Identity.GetUserId() != editmodel_post.user_id.ToString())
                {
                   // redirect to email view and show errors
                }
            }

所以

  1. 使用授权属性
  2. 使用 ValidateAntiForgeryToken 属性
  3. 检查 ModelState
  4. 检查会话或数据库