一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能

登录窗口已经完成了,现在可以完成最后的工作了,主要就是完成Membership提供者的配置。

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

 <connectionStrings>

    <addname="ApplicationServices"connectionString="Data Source=192.168.0.254;InitialCatalog=SimpleCMS;Persist Security Info=True;User ID=sa;password=abcd-1234;"providerName="System.Data.SqlClient" />

 </connectionStrings>

 

 

代码中的数据库地址、用户名和密码请根据自己实际情况填写。

然后在system.web段内添加Membership提供者的定义,代码如下:

 

   <membership>

     <providers>

       <clear />

       <add name="AspNetSqlMembershipProvider"type="System.Web.Security.SqlMembershipProvider"connectionStringName="ApplicationServices"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="ApplicationServices"applicationName="/" />

       <add name="AspNetWindowsTokenRoleProvider"type="System.Web.Security.WindowsTokenRoleProvider"applicationName="/" />

      </providers>

   </roleManager>

 

代码中,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配置,会在浏览器中打开如图13所示网站管理工具。如果刚才的配置正确,现在就可以添加用户和角色了。

图13 网站管理工具

单击页面中的安全标签页,将看到如图14的页面。

图14 安全标签页

单击角色中的“创建或管理角色”,在如图15所示的页面中,先创建系统管理员和普通用户两种角色。

图15 创建角色

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

好了,用户和角色都有了,可以完成最终的验证代码了。回到VS,切换到AccountController.cs文件,先加入对System.Web.Security的引用,然后修改验证用户和密码的判断语句,并加上写入认证Cookies的代码,最终代码如下:

    if(Membership.ValidateUser(model.UserName,model.Password))

    {

       FormsAuthentication.SetAuthCookie(model.UserName, true);

       success = true;

    }

    else

    {

       errors.Add("UserName", "错误的用户名或密码。");

       errors.Add("Password", "错误的用户名或密码。");

    }

 

 

好了,简单验证过程就完成了,不过,貌似太简单了点,呵呵。下面搞得复杂点。先把这段语句屏蔽掉,调用Membership的GetUser方法根据用户名返回类型为MembershipUser用户对象,代码如下:

MembershipUser user = Membership.GetUser(model.UserName);

 

接着判断user是否为null,如果为null,表示用户不存在,返回用户名和密码错误信息,代码如下:

if (user != null)

{

 

}

else

{

   errors.Add("UserName", "错误的用户名或密码。");

   errors.Add("Password", "错误的用户名或密码。");

}

 

 

如果用户不为null,表示用户存在。接着检查用户IsApproved属性,看用户是否被禁用了,如果是,返回用户被禁用信息,代码如下:

if (user.IsApproved)

{

}

else

{

   errors.Add("UserName", "用户已被禁用,请与管理员联系。");

}

 

接着检查IsLockedOut属性,判断用户是否已被锁定,如果锁定,返回用户被锁定信息,还需要多少分钟解锁,代码如下:

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();

}

 

代码中的LastLockoutDate属性会返回用户被锁定的时间,通过AddMinutes方法,加上锁定时间间隔,当前是60分钟,就可计算出解锁时间,将解锁时间减去当前时间,就可根据它们的差值ts判断是否已经过了解锁时间了。如果ts大于0,表示还没达到解锁时间,否则就意味着已经解锁,可以继续验证了,因而,要调用UnlockUser方法来解锁用户。

接着就可调用ValidateUser方法验证用户名和密码了,也就是把刚才屏蔽掉的那段代码复制到这里。

在验证成功后,还要验证用户的角色是否符合登录后台的要求,目前只运行系统管理员和普通用户登录,因而验证成功后的代码要修改成这样:

if (Roles.IsUserInRole(model.UserName, "系统管理员 ") |Roles.IsUserInRole(model.UserName, "普通用户"))

{

   FormsAuthentication.SetAuthCookie(model.UserName, false);

    success =true;

}

else

{

   errors.Add("UserName", "您没有权限登录系统。");

}

 

至此,整个登录过程就完成了。

posted on 2012-09-15 16:09  木鱼哥  阅读(136)  评论(0编辑  收藏  举报

导航