ASP.NET验证码控件(附详细用法)

ASP.NET验证码控件(附详细用法)


2024年2月5日发(作者:)

共享一款验证码控件(附详细用法)

最近在完善我的毕业设计——(C#)实现的三层构架的二手交易系统,觉得有必要加上验证码,这样网站的安全性会提升一些。于是利用百度、谷歌反复搜索,终于找到了一款比较牛叉的验证码控件。原作者不详,这里附上一个地址>>>。程序我做了一些小小的修改。

按原文所说的操作,根本编译不了。原文的用法可以查看上面的链接地址,这里我贴出我自己的用法。我将两个类整合到一个.cs文件中了(这里命名为),程序如下:

using System;

using c;

using entModel;

using ;

using ;

using trols;

using ;

using nState;

using g;

using ;

namespace AuthCode

{

[ToolboxData("<{0}:AuthCode runat=server>")]

public class AuthCode : WebControl

{

/// 〈summary>

/// 获得验证码的值

/// 〈/summary>

/// 〈returns>验证码〈/returns>

public string GetValue()

{

return n["value"].ToString();

}

[Bindable(true)]

[Category("Appearance")]

[Description("验证码字符长度")]

[DefaultValue("ss")]

[Localizable(true)]

//长度

internal static int mySize;

public int MySize

{

get { return ; }

set

{

= value;

}

}

public AuthCode()

: base()//重写父类的构造(输出流的HTML标记)

{ }

protected override void AddAttributesToRender(HtmlTextWriter writer)

{

ributesToRender(writer);//将要输出的的HTML标签的属性和样式添加到指定的 HtmlTextWriter中

leAttribute(, "pointer");//添加样式

ribute("onclick", "='?id='+()");//添加js

ribute(, "");

ribute("alt", "点击刷新");

}

}

public class AuthCodeHttpHander : IHttpHandler, IRequiresSessionState

{

///

/// 返回验证码字符

///

/// 验证码长度

///

private string GetRandomNumberString(int codeCount)

{

string strChoice =

"2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";

string[] strResult = (new Char[] { ',' });

string strReturn = "";

Random rnd = new Random();

for (int i = 0; i < codeCount; i++)

{

int j = ();//随机数不能大于数组的长度

strReturn = strReturn + strResult[j].ToString();

}

return strReturn;

}

private Color GetColor()

{

return ;

}

private Bitmap CreateImage(string str_AuthCode)

{

int width = str_ * 13;

int height = 20;

Random rad = new Random();

Bitmap bmp = new Bitmap(width, height);

Graphics grp = age(bmp);// 在图片上绘制图形

();//填充bmp的背景色

ctangle(new Pen(, 1), 0, 0, width - 1, height - 1);//绘制边框

int num = width * height;

for (int i = 0; i < num; i+=3)//在图片的指定坐标上画上有颜色的圆点

{

int x = (width);

int y = (height);

int r = (255);

int g = (255);

int b = (255);

Color c = gb(r, g, b);

el(x, y, c);//在图片的指定坐标上画上有颜色的圆点

}

Font f = new Font("宋体", 12, );//定义字体

Brush br = new SolidBrush();//定义画笔的颜色及字体的颜色

for (int i = 0; i < str_; i++)

{

string s = str_ing(i, 1);//单个单个的将字画到图片上

Point p = new Point(i * 12 + (3), (3) + 1);//字体出现的位置(坐标)

ring(s, f, br, p);//绘制字符串

}

e();

return bmp;//返回

}

///

/// 是否可以处理远程的HTTP请求

///

public bool IsReusable

{

get { return true; }

}

///

/// 将验证码图片发送给WEB浏览器

///

///

public void ProcessRequest(HttpContext context)

{

int size = ; //((String)n["Size"]);

MemoryStream ms = new MemoryStream(); // 创建内存流(初始长度为0 自动扩充)

string NumStr = GetRandomNumberString(size);// 获得验证码字符

("value", NumStr);//将验证码字符保存到session里面

Bitmap theBitmap = CreateImage(NumStr);// 获得验证码图片

(ms, );//将位图写入内存流

ontent(); //清除缓冲区里的所有内容输出

tType = "image/jpeg"; //需要输出图象信息 要修改HTTP头

Write(y()); //将内存流写入HTTP输出流

e(); //释放资源

();//释放资源

e();//释放资源

();

}

}

}

我是这样使用这个验证码控件的:

1:修改 文件

在 <> 间加入下面的代码:

2: “开始”—“运行”—“cmd” ,用下面的两条命令编译文件为.DLL文件。(文件保存在“C:meworkv2.0.50727”目录下) :

cd C:meworkv2.0.50727

csc /target:library

将得到的DLL文件添加到项目的引用中,在“工具箱”中右键点“选择项...”——在.net组件中勾选“AuthCode”(如下图),点确定之后工具箱中就会增加一个AuthCode控件。

将这个控件从工具箱中拖到页面里使用。选中拖出的控件,在其属性中设置MySize即验证码的长度为某一正整数。例如设置成4,自动生成的代码如下(还有自动生成的注册这个控件的代码,这里未列出):

到此,准备工作“基本”完成。(说“基本完成”是因为IIS里漏了一个必要的设置_^)

在.NET2005中通过“文件”—“打开”—“网站”—“本地IIS” 打开(C#)的网站项目,能正常运行页面,验证码控件生成的图片显示不了(只显示一个红叉)。 改用“文件系统”的形式打开则可以正常显示。这个问题我思考了好几天,还到一些技术论坛请教过别人,没人帮我解决(依靠别人是不行的)。这里只贴出那个最早的帖子的地址>>>,在编程论坛、编程爱好者上的帖子就不贴出来了。

我每天都试着去解决一下这个问题,终于慢慢找到了问题的症结。 因为是在用IIS调试时出问题的,所以我猜测问题很有可能就出在IIS的某个设置上。

今天偶然发现IIS里有修改HTTP头的设置,而且上面的程序注释中提到了要修改HTTP头,语句如下:

tType = "image/jpeg"; //需要输出图象信息 要修改HTTP头

同时, 文件中也有对“HTTP头”的设置,设置如下:

于是,我到MSDN里找到了一些与相关的资料,资料如下:

设置由应用程序子目录继承。

指令按由上而下的顺序进行处理。如果两个或多个 元素指定相同的谓词/路径组合,则最后一个 会重写其他所有元素。

Microsoft Internet 信息服务 (IIS) 有自己的 ISAPI 映射扩展模型。为使给定应用程序扩展与其处理程序之间的映射生效,该扩展必须在 IIS 中映射为 ISAPI。对于自定义扩展等非标准扩展,则必须相应地配置 IIS。

受上面资料的启发,我又仔细翻查了IIS的设置,发现有个“映射”的设置。加上考虑到这个控件实际生成的是一个.jd的文件(没见过的扩展名...),所以我怀疑用IIS调试显示不了这个验证码图片的症结就在这里

我以“ IIS”为关键字百度了一下,经验证,终于找到了准确有效的设置办法:

通过“程序”—>“管理工具”—>“Internet 信息服务”—>选中“默认网站”—>右键点“属性”

—>“主目录”—>“配置”—>“映射”—>“添加”来设置:

路径为: C:meworkv2.0.50727aspnet_

扩展名为: .jd

限制为:GET,HEAD,POST,DEBUG

去掉“检查文件是否存在”前的勾。(必须去掉这里的“√”)

如下图:

补充:

一般来说,我们只要在IIS控制台中打开目标网站的属性设置窗口,单击其中的“主目录”标签,在该标签设置页面的“应用程序设置”处单击“配置”按钮,在其后界面中单击“添加”按钮,之后就能根据界面提示完成应用程序扩展名映射添加操作了。然而,有的朋友在打开应用程序扩展名添加对话框后,发现其中的“确定”按钮处于灰色不可用状态;并且,朋友通过“浏览”按钮导入了应用程序详细路径,以及设置了对应程序的扩展名后,发现应用程序扩展名添加对话框中的“确定”按钮依然处于灰色不可选状态。

要想解决这种故障现象,我们只要将鼠标指针移动到图1界面的“可执行文件件”文本框中并进行单击操作,这样我们就会看到压缩路径此时就会自动失效,同时应用程序扩展名映射添加/编辑对话框中的“确定”按钮也就被自动激活了,一旦发现“确定”按钮处于可点击状态时,我们就能成功完成应用程序扩展映射配置操作了。当然,我们如果知道目标应用程序的详细路径时,可以直接采用手工输入的方法输入目标应用程序的路径信息,并且设置好它的扩展名称,这样一来“确定”按钮就不会失效,我们只要单击“确定”按钮,就能将指定的应用程序扩展名映射添加成功了。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1707116069a1477499.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信