一种利用电子邮件帐号对Web
应用程序进行身份验证的方法
云太真
(上海政法学院,上海 201701)
摘 要 本文阐述了一种利用电子邮件的帐号进行用户身份验证的方法,一些小的Web应用程序可利用该方法进行用户管理,从而提高Web应用程序的可用性,减少用户管理的成本。
关键词 身份验证;Web应用;POP3;电子邮件
1 概述
在网络管理实践中,系统管理员经常需要编写一些小型Web应用程序,以收集内部用户提交的信息,为各种工作提供数据。在此情况下,为防止个别用户恶意使用程序,有必要对用户进行身份验证。
但另一方面,对不特定的用户分发用户名和密码本身又是比较麻烦的工作。在没有集成登录验证的情况下,本文利用校园网已存在的邮件系统,使用POP3协议对用户进行了身份验证,取得了良好的使用效果。
2 POP3协议中的用户验证
POP3协议是一种应用层协议,它的主要目标是收邮件,最常见的应用软件是OutLook,很多人用它收发邮件。POP3协议从邮件服务器收邮件时,首先需要发送用户名和密码进行身份验证,验证通过以后才可以下载邮件,完成以后发送退出指令断开连接。
POP3协议首先需要向邮件服务器的110端口建立TCP连接,连接建立后,邮件服务器将传回欢迎信息,一般是:
+OK POP3 Server ready
此时,用户应当向用户发送USER和PASS指令验证用户名和密码,即:
用户:USER username
服务器:+OK user name received,please send password
用户:PASS password
服务器:+OK username’s maildrop has 2 messages (320 octets)
这就说明用户已经通过了身份验证。
在有些情况下,邮件服务器会返回错误信息,例如:
用户:USER liping
服务器:-ERR invalid mailbox
这说明邮件服务器中不存在名为liping的用户
事实上,为了避免恶意使用该指令,目前多数邮件系统收到USER指令后不发送“-ERR”消息,而是返回“+OR”消息直到对方使用PASS指令后告知密码错误。
用户:USER wanggang
服务器:+OK user name received,please send password
用户:PASS password
服务器:-ERR invalid password.
这说明用户输入的密码不正确,实际上也可能是用户名不存在。
最后,用户发出QUIT退出指令与服务器断开连接。
注意,本文中描述的POP3验证方式指的是简单的明文传送。目前POP3协议还认可“APOP”和“AUTH”两种认证方式,邮件服务器通常会支持其中的一种身份验证方式,对于编程来讲,差别不大,故不再详细阐述。
3 身份验证代码的实现
本文根据POP3协议的指令和验证过程,使用C#编写了专门利用POP3协议进行登录验证的函数,主要代码如下:
using System;
using System.Collections;
//下面函数需要引用的命名空间
using System.Net;
using System.Net.Sockets;
using System.IO;
//其它代码省略
//对页面文件登录输入框提交按钮的响应函数
private void btnLogin_Click(object sender,System.EventArgs e)
{
string username,password;
int index=-1;
username=this.tbUsername.Text;
password=this.tbPassword.Text;
//考虑用户输入包括域名的情况,要删除@及后面的域名
index=username.IndexOf("@",0,1);
if(index>1)
username=username.Remove(index,username.Length-index);
if(POP3CheckUser(username,password))
{
//通过验证后做相应动作
Session["username"]=username;
Response.Redirect("Default.aspx");
}
else
{
//未通过验证,页面显示错误信息
this.lblErrMsg.Text ="用户名或密码错误!";
}
}
//利用POP3协议到邮件服务器进行验证
private bool POP3CheckUser(string Username,string Password)
{
string MailServer="pop3.shupl.edu.cn"; //POP3服务器的域名
NetworkStream myNetworkStream;
string result;
try
{
//打开POP3服务器端口
TcpClient myTcpClient=new TcpClient(MailServer,110);
myNetworkStream=myTcpClient.GetStream();
StreamReader yStreamReader =new StreamReader(myNetworkStream);
StreamWriter myStreamWriter =new StreamWriter(myNetworkStream);
result=myStreamReader.ReadLine();
//发出USER指令
myStreamWriter.WriteLine("USER " + Username);
myStreamWriter.Flush();
result=myStreamReader.ReadLine();
//判断是否存在该用户
if(result.Substring(0,3)=="-ER")
{
//说明无此用户名,发出QUIT指令退出POP3验证过程
myStreamWriter.WriteLine("QUIT ");
myStreamWriter.Flush();
myTcpClient.Close();
return false;
}
//发出PASS指令
myStreamWriter.WriteLine("PASS " + Password);myStreamWriter.Flush();
result=myStreamReader.ReadLine();
//判断POP3登录是否成功
if(result.Substring(0,4)=="-ERR")
{
//无法登录,可能密码错误
myStreamWriter.WriteLine("QUIT ");
myStreamWriter.Flush();
myTcpClient.Close();
return false;
}
else
{
//验证成功
myStreamWriter.WriteLine("QUIT ");
myStreamWriter.Flush();
myTcpClient.Close();
return true;
}
}
catch
{
this.lblErrMsg.Text="服务器验证帐号时出错,请稍后再试!";
return false;
}
}
//………………………………………………..
以上代码在.Net Framework 1.1环境下编译通过。
4 应用现状
笔者在校园网管理过程中,考虑到管理和应用的实际需要,编写了IP地址管理和注册、用户技术支持服务、教师课件上传下载等Web系统,这些应用面向所有校园网用户,分发帐号是很麻烦的,不进行身份验证又容易导致被恶意使用。采用电子邮件帐号进行身份验证基本上解决了这个困境。
除此之外,在程序设计时,也不再需要设计创建用户,修改密码这样的页面,系统不需要考虑用户名和密码保存的问题,邮件系统中已经将其考虑得非常完善了。
参考文献
[1]张蓓 编著 ASP.NET 通用模块及典型系统开发实例导航,人民邮电出版社,2006.2
[2]吕文达 编著 精通Visual Basic.NET网络与输入/输出技术,清华大学出版社,2005.8
[3]施威铭研究室 著 Internet 协议概念与实践 清华大学出版社,2001.10
收稿日期:10月15日 修改日期:10月21日 |