专栏首页技术博客ExtJs五(ExtJs Mvc登录优化)

ExtJs五(ExtJs Mvc登录优化)

前言

继上一节中简单的实现了登录之后http://www.cnblogs.com/aehyok/archive/2013/04/20/3033296.html,现在我们可以进行对登录界面进行再次的优化。

MemerShip配置

 首先打开Web.Config文件,在configuration段内添加一个数据库连接定义,代码如下:

  <connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=MWVCMNFFK0ZAZT5;Initial Catalog=SimpleCMS;Persist Security Info=True;User ID=sa;Password=saa;Pooling=False" providerName="System.Data.SqlClient"></add>
  </connectionStrings>

代码中的数据库地址、用户名和密码请根据自己实际情况填写。然后在system.web段内添加Membership提供者的定义,代码如下:

    <membership>
      <providers>
        <clear />
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ConnectionString" 
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" 
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" 
             passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager enabled="true">
      <providers>
        <clear />
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ConnectionString" 
             applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>

上面的connectionStringName="ConnectionString" 要与上面配置的数据库链接字符串保持一致。

代码中,membership段是用来定义Membership提供者的,定义的内容包括:

     类型(type)为SQLMembershipProvider,表示使用的是SQL Server提供者;

     数据库的连接字符串(connectionStringName)为刚才定义的连接字符串;

     密码恢复(enablePasswordRetrieval)为fallse;

     重置密码(enablePasswordReset)为true;

     要求密码问题(requiresQuestionAndAnswer)为false;

     要求唯一电子邮件(requiresUniqueEmail)为true;

     最大的密码错误尝试次数(maxInvalidPasswordAttempts)为5次;

     密码最小长度(minRequiredPasswordLength)为6;

     密码最小的非字符个数(minRequiredNonalphanumericCharacters)为0;

     有效密码或密码答案的连续失败尝试次数进行跟踪的时间间隔(passwordAttemptWindow)为10分钟。

最后的applicationName,表示当前应用程序的标识,因为没有多个应用程序使用该数据库提供者,因而设置为“/”。

而roleManager段定义的角色提供者,主要定义就是连接字符串和应用程序的标识。

完成后,在主菜单中选择项目,ASP.NET配置。如果刚才的配置正确,现在就可以添加用户和角色了。

单击页面中的安全标签页。

单击角色中的“创建或管理角色”,先创建系统管理员和普通用户两种角色。返回安全标签页,单击用户中的“创建用户”创建admin和test两个用户。两个用户的密码都设置为123456,电子邮件随便填吧。还要将admin的角色设置为系统管理员,test的角色设置为普通用户。

然后返回到AccountController中,修改Login的Action的代码如下

        public JObject Login(LoginModel model)
        {
            bool success = false;
            JObject errors = new JObject();
            if (ModelState.IsValid)
            {
                string vcode = "";
                if (Session["vcode"] != null)
                {
                    vcode = Session["vcode"].ToString();
                }
                if (vcode.Count() > 0 && vcode.ToLower() == model.Vcode.ToLower())
                {
                    MembershipUser user = Membership.GetUser(model.UserName);
                    if (user != null)
                    {
                        if (user.IsApproved)
                        {
                            TimeSpan ts = user.LastLockoutDate.AddMinutes(60) - DateTime.Now;
                            if (user.IsLockedOut && ts.Minutes > 0)
                            {
                                errors.Add("UserName", "用户名已被锁定," + ts.Minutes + "分钟后才能再次尝试登录。");
                            }
                            else
                            {
                                if (user.IsLockedOut) user.UnlockUser();
                                if (Membership.ValidateUser(model.UserName, model.Password))
                                {
                                    if (Roles.IsUserInRole(model.UserName, "系统管理员 ") | Roles.IsUserInRole(model.UserName, "普通用户"))
                                    {
                                        FormsAuthentication.SetAuthCookie(model.UserName, false);
                                        success = true;
                                    }
                                    else
                                    {
                                        errors.Add("UserName", "您没有权限登录系统。");
                                    }
                                }
                                else
                                {
                                    errors.Add("UserName", "错误的用户名或密码。");
                                    errors.Add("Password", "错误的用户名或密码。");
                                }
                            }
                        }
                    }
                    else
                    {
                        errors.Add("UserName", "错误的用户名或密码。");
                        errors.Add("Password", "错误的用户名或密码。");
                    }
                }
                else
                {
                    errors.Add("Vcode", "验证码错误");
                }
            }
            else
            {
                MyFunction.ModelStateToJObject(ModelState, errors);
            }
            return MyFunction.WriteJObjectResult(success, errors);
        }

首先前面还是对验证码的验证。

然后通过MembershipUser user = Membership.GetUser(model.UserName)获得MembershipUser用户对象。

通过验证即可。然后F5运行测试一下。

通过test来测试

然后通过admin来测试

看这就是测试结果。

示例代码下载链接http://files.cnblogs.com/aehyok/ExtJsLoginBetter.rar

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Knockout.Js官网学习(checked 绑定)

    checked绑定是关联到checkable的form表单控件到view model上 - 例如checkbox(<input type='checkbox'>...

    aehyok
  • Win8 连连看小程序

    看到win8和VS2012都发布有些日子,心里也痒痒的,于是就学习了几天关于在VS2012下开发,当然主要是开发应用商店小程序。学习期间一直参考:

    aehyok
  • C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

      之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处。

    aehyok
  • Django源码学习-25-ContentType

    Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(...

    小团子
  • 实践 | 目前最快精度最高检测框架(EfficientDet)

    项目链接:https://github.com/signatrix/efficientdet

    计算机视觉研究院
  • Tensorflow之MNIST CNN实现并保存、加载模型

    本文实例为大家分享了Tensorflow之MNIST CNN实现并保存、加载模型的具体代码,供大家参考,具体内容如下

    砸漏
  • 守护进程详解

    在一个多任务的电脑操作系统中,守护进程(英语:daemon,/ˈdiːmən/或/ˈdeɪmən/)是一种在后台执行的电脑程序。此类程序会被以进程的形式初始化。...

    JavaEdge
  • keras.backend

    Creates a 1D tensor containing a sequence of integers.

    于小勇
  • 图解Java设计模式之代理模式

    1)代理模式 :为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是 :可以在目标对象实现的基础上,增强额外的功能操作,即...

    海仔
  • 基于react/vue搭建一个通用的表单管理配置平台

    熟悉我的朋友可能会知道,我一向是不写热点的。为什么不写呢?是因为我不关注热点吗?其实也不是。有些事件我还是很关注的,也确实有不少想法和观点。但我一直奉行一个原则...

    徐小夕

扫码关注云+社区

领取腾讯云代金券