zoukankan      html  css  js  c++  java
  • 注册登录过程点滴(二):使用MVC Remote验证的注意点

    这其实是一个比较简单的问题,但往往挺容易被忽略,这次我们在推广我们的互联网平台的时候就吃了这么一个大亏。 一般用户注册过程中,前端注册往往会检验用户名、昵称是否已存在,甚至验证码是否匹配,我们都可以用Remote的验证很方便的解决。

    直接上关键代码:

     public class RegisterModel

    {       
            [Required(ErrorMessage = "*邮箱地址不能为空")]
            [DataType(DataType.EmailAddress)]
            [RegularExpression(@"^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$", ErrorMessage = "*请输入正确的邮箱格式")]
            [Remote("IsExistEmail""Validator",ErrorMessage="*该邮箱地址已经被注册过")]
            public string email { getset; }

    ... 

    /// <summary>
            
    /// 验证该EMail账户是否已经被注册过了
            
    /// </summary>
            
    /// <param name="email"></param>
            
    /// <returns></returns>
           
            public JsonResult IsExistEmail(string email)
            {
                bool valid = false;
                if (!AccountServices.IsExistMail(email))
                    valid = true;
                
                return Json(valid,JsonRequestBehavior.AllowGet);

            }

    前端的代码如下:

    @Html.TextBoxFor(m => m.email)
    @Html.ValidationMessageFor(m => m.email)

    代码很简单,我想大家都很容易懂,但问题在哪里呢?

    问题就是注册完成后,如果你直接点浏览器后退,就能绕开这个验证机制,因为验证通过这个过程被缓存起来了。

    这样就很容易在后端出现冗余数据,甚至搞乱程序的业务规则,当然健壮的程序会在业务层再次验证是否存在email,存在则抛出异常,但往往这是避免恶意注册和攻击之类的,返回到用户这边是出错页面,非常的不友好。此类问题在注册码等场景上问题更大,明明用户输入的是正确的验证码,由于缓存了之前的,所以怎么输都不对,从而让这些用户流失,所以还是要从本源上去解决:

    解决思路其实很简单:你缓存是吧,我不让你缓存不就行了?ValidatorController中代码如下: 

    using System.Web.UI;
    /// <summary>
            /// 验证该EMail账户是否已经被注册过了
            /// </summary>
            /// <param name="email"></param>
            /// <returns></returns>
            [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]   //清除缓存
            public JsonResult IsExistEmail(string email)
            {
                bool valid = false;
                if (!AccountServices.IsExistMail(email))
                    valid = true;
                
                return Json(valid,JsonRequestBehavior.AllowGet);
    }


    到此,这个场景下的问题可以解决,因为想让大家更从实际场景的思维方式去考虑问题,写的有点罗嗦了,请见谅! 

  • 相关阅读:
    react路由组件&&非路由组件
    react函数式组件(非路由组件)实现路由跳转
    react使用antd组件递归实现左侧菜单导航树
    【LeetCode】65. Valid Number
    【LeetCode】66. Plus One (2 solutions)
    【LeetCode】68. Text Justification
    【LeetCode】69. Sqrt(x) (2 solutions)
    【LeetCode】72. Edit Distance
    【LeetCode】73. Set Matrix Zeroes (2 solutions)
    【LeetCode】76. Minimum Window Substring
  • 原文地址:https://www.cnblogs.com/jivenbest/p/2600869.html
Copyright © 2011-2022 走看看