• 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来测试

    看这就是测试结果。

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

  • 相关阅读:
    OpenGL, Net 2005, error C2381: 'exit' : redefinition; __declspec(noreturn) differs
    24点游戏
    一个3*3的格子,给定n>=10, 将[1,n]中的数填入方格中,使得相邻方格的数的和为质数
    最大子矩阵问题 PKU 1050
    12年9月12日
    再谈MSDN Library For Visual Studio 2010
    漫谈.NET开发中的字符串编码
    《.NET 4.0网络开发入门之旅》4:与Socket的第一次“约会”
    “.NET 4.0 网络开发入门之旅系列文章”—— IP 知多少?(下)
    C#之int挑战Java之Integer
  • 原文地址:https://www.cnblogs.com/aehyok/p/3034683.html
Copyright © 2020-2023  润新知