推荐.NET教程: ASP.NET C# 开发环境 Ajax教程 控件开发 统计报表 数据库 Web服务 安装部署 CommunityServer NHibernate DataGrid/GridView 实用代码 VS2005
示例源码 MVC/三层 SqlHelper 入门源码 开源 CMS Ajax/Atlas C#.net 毕业设计 源码 经典代码 商业 本站作品 持久层 随书源码 WebService 英文/汉化 Asp.net2.0

阿牛·乐园

每天进步一点点

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  80 随笔 :: 14 文章 :: 389 评论 :: 13 引用
  网站在进行重要操作步骤时,为了防止攻击,一般都采用生成验证码的方法。为了使用方便,我自己写了一个从BaseValidator实现的验证控件,负责给指定的Image控制设置ImageSrc并在验证失败时,清空TextBox控制的值。从BaseValidator继承,是因为服务端只需调用
 if(Page.IsValid){} 
就可以了。

下面主要代码公布如下,希望大家拍砖。
使用代码示例:
                        <asp:TextBox ID="TextBox1" runat="server" AutoCompleteType="Disabled"  ></asp:TextBox>
                        
<asp:Image ID="Image1" runat="server" ImageAlign="absMiddle" />
                        
<asp:ImageValidator runat="server" ID="imagevalidator" 
          ImageControl
="Image1" 
          ControlToValidate
="TextBox1" 
          Display
="Dynamic"
          CharCount
="4" 
          Fonts
="宋体,Gungsuh,仿宋,黑体" 
          BgColor
="White" 
          MaxFontSize
="16" 
          MinFontSizePercent
="50" 
          ErrorMessage
="验证码错误!" 
          SetFocusOnError
="True" />
后台编码:
        protected void OnLogin(object sender, EventArgs e)
        
{
            
try
            
{
                
if (Page.IsValid)
                
{
                    
string hashedPwd = Utility.Md5.HashedString(this.tbLoginPassword.Text.Trim());
                    Manager manager 
= Manager.CreateInstance(this.tbLoginName.Text.Trim(), hashedPwd);
                    
//登陆成功
                    ManagePageBase.SetAuthSession(manager);
                                                          System.Web.Security.FormsAuthentication.RedirectFromLoginPage(manager.Name, 
false);
                }

            }

            
catch (BusinessException ex)
            
{
                
this.ShowMessage(ex.Message);
            }

        }


实现代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.ComponentModel;
using System.Web.Configuration;
using System.Drawing.Design;
using System.Drawing;
using System.Web.SessionState;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Iyond.Web.UI.WebControls
{
    
public class ImageValidator : System.Web.UI.WebControls.BaseValidator
    
{

        
private string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        [Bindable(
false)]
        [Category(
"Data")]
        [DefaultValue(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")]
        [Localizable(
true)]
        [Description(
"用于生成验证码的源字符")]
        
public string Chars
        
{
            
get
            
{
                
return _chars;
            }


            
set
            
{
                _chars 
= value;
            }

        }


        
private int _charCount = 5;
        [Bindable(
false)]
        [Category(
"Data")]
        [DefaultValue(
5)]
        [Localizable(
true)]
        [Description(
"验证码中字符的数量")]
        
public int CharCount
        
{
            
get
            
{
                
return _charCount;
            }

            
set
            
{
                _charCount 
= value;
            }

        }


        
private string _pageValidateCode = "~/IyondValidateCode.aspx";
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"在Web.config中的HttpHandler节中配置的读取验证码的页面")]
        
public string ValidateCodePage
        
{
            
get return _pageValidateCode; }
            
set { _pageValidateCode = value; }
        }



        
private int _minFontSizePercent = 60;
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"字体最小高度占Image控件高度的百分比")]
        
public int MinFontSizePercent
        
{
            
get
            
{
                
return _minFontSizePercent;
            }

            
set
            
{
                
if (value > 100)
                    
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最大为100(表示100%)");
                
if (value < 50)
                    
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最小为50(表示50%)");

                _minFontSizePercent 
= value;
            }

        }



        
public int MinFontSize
        
{
            
get
            
{
                
return Convert.ToInt32(this.MaxFontSize * this.MinFontSizePercent / 100 + 1);
            }

        }


        
private int _maxFontSize = 100;
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"字体最大高度占Image控件高度的百分比")]
        
public int MaxFontSize
        
{
            
get
            
{
                
return _maxFontSize;
            }

            
set
            
{
                
if (value > 100)
                    
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最大为100");
                
if (value < 6)
                    
throw new ArgumentOutOfRangeException("MaxFontSize", value, "最小为6");
                _maxFontSize 
= value;
            }

        }


        
private Color _fontColor = Color.Black;
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"字体颜色")]
        
public Color FontColor
        
{
            
get
            
{
                
return _fontColor;
            }

            
set
            
{
                _fontColor 
= value;
            }

        }


        
private Color _bgColor = Color.White;
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"字体颜色")]
        
public Color BgColor
        
{
            
get
            
{
                
return _bgColor;
            }

            
set
            
{
                _bgColor 
= value;
            }

        }


        
private bool _ignoreCase = true;
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"是否乎略大小写")]
        
public bool IgnoreCase
        
{
            
get return _ignoreCase; }
            
set { _ignoreCase = value; }
        }


        
private bool _enableChangeImage = true;
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"是否允许更换图片")]
        
public bool EnableChangeImage
        
{
            
get return _enableChangeImage; }
            
set { _enableChangeImage = value; }
        }


        
private int _maxRotate = 45;
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"每个字的最大旋转角度")]
        
public int MaxRotate
        
{
            
get return _maxRotate; }
            
set { _maxRotate = value; }
        }


        
private List<string> _fonts = new List<string>();
        [Category(
"Data")]
        [Localizable(
true)]
        [Description(
"字体列表,从中随机选择")]
        [Editor(
"System.Windows.Forms.Design.StringArrayEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
        
typeof(UITypeEditor)), TypeConverter(typeof(FontNamesConverter)),
        RefreshProperties(RefreshProperties.Repaint), 
        NotifyParentProperty(
true)]
        
public string[] Fonts
        
{
            
get
            
{
                
return _fonts.ToArray();
            }

            
set
            
{
                
if (value == null)
                    
throw new ArgumentNullException("Fonts");

                _fonts.Clear();
                _fonts.AddRange(value);
            }

        }




        
private static Dictionary<string, ImageValidatorConfig> runtimeConfig = new Dictionary<string, ImageValidatorConfig>();

        
/// <summary>
        
/// 查询验证码配置
        
/// </summary>
        
/// <param name="sign">验证码标识</param>
        
/// <returns></returns>

        public static ImageValidatorConfig GetConfig(string sign)
        
{
            
if (!runtimeConfig.ContainsKey(sign))
                
throw new ArgumentOutOfRangeException("sign", sign);

            
return runtimeConfig[sign] as ImageValidatorConfig;
        }



        
/// <summary>
        
/// 计算是不是合法(验证码是不是正确)
        
/// </summary>
        
/// <returns></returns>

        protected override bool EvaluateIsValid()
        
{
            
bool isValid = false;
            
string text1 = base.GetControlValidationValue(base.ControlToValidate);
            
if ((text1 == null|| (text1.Trim().Length == 0))
            
{
                isValid 
= false;
            }

            
else
            
{