一种利用电子邮件帐号对Web应用程序进行身份验证的方法

作者:    更新时间:2009-3-26 10:31:45
一种利用电子邮件帐号对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日

上一篇:3G技术应用对人际传播的影响
下一篇:基于任务级的设备动态调度机制的设计与实现
站内搜索
无忧学术网 | 论文写作研究网 | 支付宝 | 电子工程师论坛 | 上海交通大学 | 东南大学 | 复旦大学 | 同济大学 | 浙江大学 | 清华大学 | 北京大学 | 承运天成 | 搜狐 | 百度 | google | 搜狗 | 雅虎 | 新浪 | 网易 | 麻省理工学院 | 中华英才网 | 无忧工作网 | 智联招聘 | 爱词霸 | 淘宝网 | 阿里巴巴 | 校友录 | 哈佛大学 | 耶鲁大学 | 腾讯 |
代写硕士论文 | 代写工程硕士论文 | 上海代写硕士论文 | 上海代写论文 | 职称论文 | 代写研究生论文 | 代写MBA论文 | 代写MPA论文 | 代写论文网