2017-02-27 53 views
0

我有一个.NET MVC5网站,用户使用Microsoft Identity登录。我有多个表单文章用于在网站中添加和编辑项目。我期待知道为了我应该在执行验证: -我应该先检查身份验证还是ModelState.IsValid

  • ModelState.IsValid然后User.Identity.IsAuthenticated
  • User.Identity.IsAuthenticated然后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 
     } 
    } 
} 

我应该换轮这段代码首先检查模型,CH前ecking认证,以便我有: -

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

     if (profile != null) 
     { 

      // Do logic here... 
     } 
    } 
} 

或者这里没有区别吗?我在整个网站上重复了这段代码,因此寻找哪个更好的选择?我目前使用的是第一个,因为我觉得除非通过验证,否则你甚至不应该试图检查模型?

此处有任何建议吗?

谢谢!

+2

认证首先,你做到这一点通过添加'[授权]'属性的方法(或控制器) –

+0

使用授权属性,像斯蒂芬说。验证发生在授权之后,因为您不希望授权用户查看模型是否无效 – lordkain

+0

[Authorize]与if(User.Identity.IsAuthenticated)的用法相同吗?如果是这样的话! –

回答

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. 对证会话或数据库
相关问题