一、登录失败提示
利用PlaceHolder控件我们可以实现一个简单的登录失败提示,具体操作如下:
<asp:PlaceHolder runat="server" ID="ErrorMessage" Visible="false">
<p class="text-danger">
<asp:Literal runat="server" ID="FailureText" />
</p>
</asp:PlaceHolder>
PlaceHolder控件可以用来在网页上占据一块空间,我们可以通过它动态添加控件,除了可以使用HTML脚本外,我们还可以在服务器上调用它们。Literal是个静态文本控件,用于显示文字内容,但无法将样式应用到该内容中。写入以上代码后,我们可以在后台直接调用“FailureText.Text”来设置信息文本,然后将Visible设置为true即可。
二、微软的登录验证思路
巨硬在前几年公布了一个名为ASP.NET Identity的验证组件,大致使用思路如下:
1、判断页面验证是否通过,如果通过则:
{
1.1、创建UserManager对象manager // 用于管理用户信息
1.2、创建新用户ApplicationUser对象 // 该对象由manager提供,manager通过用户输入的账号密码匹配符合条件的账户
1.3、如果该用户信息存在,则:
{
1.3.1、将该用户设置为登录状态
1.3.2、将页面跳转至登录页面的父页面
}
否则:
{
1.3.3、设置FailureText为相应的提示信息
1.3.4、将其Visible属性设置为true
}
}
实现起来的代码如下:
protected void LogIn(object sender, EventArgs e)
{
if (IsValid)
{
// Validate the user password
// Create a new user
var manager = new UserManager();
ApplicationUser user = manager.Find(UserName.Text, Password.Text);
if (user != null)
{
IdentityHelper.SignIn(manager, user, RememberMe.Checked);
IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
}
else
{
FailureText.Text = "Invalid username or password.";
ErrorMessage.Visible = true;
}
}
}
在这里,开发者首先选择判断页面的验证是否通过,这是为了保证用户的输入时合法的。我们可以通过Page.Validate()方法手动进行验证,或者是让系统在开始处理窗体事务后自行验证,每次验证的结果都由页面上所有的验证控件来决定,只有在全部验证都通过后(即验证成功),IsVaild的值才为true。
验证完毕后,创建一个UserManager对象,这个UserManager在我目前看来是整个Identity组件的核心,它的作用就是“Provides the APIs for managing user in a persistence store.”(提供一个用于在持久性存储空间中管理用户的API)。具体的文档内容在此:UserManager Class (Microsoft.AspNetCore.Identity) | Microsoft Docs 。同时创建的还有一个ApplicationUser对象,这个ApplicationUser在这个案例中是系统自己生成的用户类对象,系统自带的注释称“可以通过将更多属性添加到用户类来为用户添加用户数据”,它同时继承了一个名为IdentityUser的类,是IdentityUser 的默认实现,使用字符串作为主键,从使用情况来看,这个就是组件中用来记录用户信息的实体类了,与JavaWeb中提到的POJO类的概念有相似之处。
真正让我感到好奇的是下面那个IdentityHelper类,这玩意儿不是Identity组件里预先准备好的,它放在了一个名为IdentityModels的cs文件里,不继承任何类,但它调用了IAuthenticationManager这个用于认证管理服务的接口,我很怀疑这部分是不是属于MVC中Model的功能,毕竟人家连名字都有个Model。百度和谷歌都没有给我答案,或许等进一步学完MVC后我就能知道了。