ASP.NET2.0中集成的成员控制可以方便我创建 登录,注册,修改密码,找回密码 等一系列的用户认证授权.
可在集成的Login控件中却没有验证码,可做有些网站时客户又非要用验证码,这就需要改写Login控件了.
关于生成验证码的代码,网上有很多,生成效果也都不错,其实参考别人写的代码自己重新写一个也是很简单的,反正就是两大步,
一:生成足够随机的随字符.
二:生成的随机字符转成图片,加上干扰元素.
而且可以有自己的特色.
生成的图片放到网页上也简单的用一个<IMG ... />就可以了,
一个问题来了,图片贴上去了可"看不清,换一张"这个功能怎么实现.
经过我的摸索发现,可以在放<img.../>标记外放一个<span id="XXX"></span>
然后写一个JS文件
<script language="Javascript" type="text/javascript" >
function Showcode(menu)
{
var tempElement =document.getElementById(menu);
tempElement.innerHTML ="<img src=/"bbb/ccc.ashx/" />";
}
function dcode(menu)
{
var tempElement =document.getElementById(menu);
tempElement.innerHTML ="验证图";
}
</script>
然后拖一个html的text控件
<input id="aaa" type="text" runat="server" οnfοcus="Showcode('XXX')" οnblur="dcode('XXX')" />
这样.只要光标点到这个控件,就会在<span></span>标记中出现验证图,光标点到其他地方验证图会消失,
再点到这控件就会换一张图片了.
接下去的问题是怎么在验证用户名和密码前先判断验证码;
在Login控件中添加Authenticate事件;
事件中这么写:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
string Codetext = ((HtmlInputText)login1.FindControl("ValidateTextbox")).Value;
if (Session["CodeString"] == null) //CodeString是在图片生成页中设置的Session
{
login1.FailureText = "验证码不能为空!";
e.Authenticated = false;
return;
}
string CodeString = Session["CodeString"].ToString();
if (CodeString == Codetext)
{
if (Membership.ValidateUser(login1.UserName, login1.Password)) //必须有这个判断,网上很多都没有这个判断,
{ //导致只要验证码对了,不管用户是否存在,
Session.Remove("CodeString"); //用户名是否对,都会成功登录,这是千万要注意的
e.Authenticated = true;
return;
}
else
{
login1.FailureText = "用户名或密码错误!";
Session.Remove("CodeString");
e.Authenticated = false;
return;
}
}
else
{
login1.FailureText = "验证码错误!";
Session.Remove("CodeString");
e.Authenticated = false;
return;
}
}