一步一步使用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", "您没有权限登录系统。");
}
至此,整个登录过程就完成了。