总结几种身份验证技术

在网络攻击和诈骗“盛行”的今天,身份验证技术成为最敏感的话题,不论对应用程序设计者还是开发人员,安全性都是关注的主要问题。您需要保护存储敏感信息的应用程序,既要防止恶意攻击,又要防止竞争对手窃取信息或知识产权。在为您的应用程序设计安全模型时,您需要从业务角度了解安全要求,以及选定的安全模型在性能、可伸缩性和部署上所具有的含义。

1. 几种身份验证技术方案

1.1 表单身份验证

表单身份验证是指接受用户凭据的自定义用户界面组件,例如,一个用户名和密码。现在使用的许多 Internet 应用程序具有这种供用户登录的表单。值得注意的是,表单本身并不执行身份验证,它仅仅是一种获得用户凭据的方法。身份验证是通过使用自定义代码访问用户名和密码数据库来实现的。
验证用户身份后,服务器一般会通过某种方式向客户端表明其已经通过身份验证,可以进行后续请求。如果需要,您可以强制用户验证每个请求,但这样会影响性能和可伸缩性。您应考虑两种基本方法来识别以前登录过的客户端:
Cookie。Cookie 是最初由服务器向客户端发送的一小段数据。随后,由客户端随每个 HTTP 请求将其发送回服务器。它可以用作客户端已经通过身份验证的标志。ASP .NET 通过 CookieAuthenticationProvider 模块为您提供了使用 Cookie 进行表单身份验证的机制。大多数 Web 浏览器(包括 Internet Explorer 和 Netscape Navigator)均支持 Cookie。

这种身份验证技术比较容易实现,开销少;但是用户凭据所需的用户名和密码是通过表单传输,这就意味着它的安全性是相当低的,因为黑客很容易截获网络上的用户名和密码明文。这种方案的另一个缺点是:用户名和密码是存储在数据库当中,一旦当攻击者掌握了数据库的登录密码,那么所有的用户资料都将暴露无疑,即便你的系统中用户口令串是加密存储的。

1.2 Windows 身份验证。

该提供程序利用了 IIS 的身份验证功能。当 IIS 完成身份验证后,ASP .NET 使用已验证标识的标记来授权访问。使用该方法,您不必编写任何特定身份验证代码。当使用该方法验证时,ASP .NET 根据已验证用户在应用程序环境中构造并附加一个 Windows Principal 对象。这样,ASP .NET 线程就能够作为已验证用户运行,并可获得用户的组成员身份。

如下图所示,浏览器向 web 服务器发出请求,web服务器将身份验证交给windows ,此时IIS给浏览器提供登录对话框,windows完成身份验证后,ASP .NET程序获得用户帐户,然后根据系统的权限数据库分配用户权限,并将结果返回浏览器,完成用户的登录。

1. 几种方案的比较
2.1 易于实现性
表单验证:易于实现是该方式的优点,用户只需编写部分程序 ,从表单中取得用户名和密码数据,与数据库中的记录相比较,若一致则通过验证,然后服务器向客户端写入验证标识:Cookie ,这就意味着以后不再需要身份验证。
Windows身份验证:对于验证,该方式几乎不需要任何代码,只需在ASP.NET程序中,取得登录者身份,然后根据数据库中规定的权限,来限制访问。

2.2安全性
对于表单验证,其安全性主要在以下两方面较薄弱:首先,该验证方式需要一个用户名密码数据库,也就意味着数据库一旦丢失,用户信息就会全部暴露。其次,表单验证过程中用户名和密码在网络上是以明文的方式传输,攻击者很容易截获敏感信息。
而采用windows集成身份验证,则不会出现该问题,因为用户帐户就是windows帐户,而且用户名和密码是以加密的方式传输。

2.3 其他方面
对浏览器的支持:表单验证支持非IE浏览器,而windows身份验证除IE浏览器外不支持其他浏览器。
对用户帐户的要求:windows身份验证要求用户必须拥有windows帐户,表单验证则无此要求。
另外,windows验证可以实现无缝登录,即不弹出式登录对话框。这对于拥有个人计算机的用户来说相当方便的。
2. 方案的选择
考虑上述两种方案的优缺点,结合本公司系统开发的特点,即对用户身份验证要求较为严格,用户群较少;我们采用windows身份验证方式。

3. Windows 身份验证的实现方式
4.1 环境设置
  如果您的 ASP .NET 应用程序需要作为已由 IIS 使用集成 Windows 身份验证进行过验证的用户来运行,请使用以下 Web.config 配置:
// web.config 文件
<system.web>
<authentication mode="Windows" />
</system.web>
4.2 权限配置
首先,你要建立用户权限配置数据库;注意,这里所建立的配置数据库只保存用户的基本信息和所拥有的权限,并不存储用户密码。
在配置用户权限之前,必须为用户创建 windows帐户,然后将用户添加到你的程序中,即把Windows帐户添加到数据库中并分配其合适的权限。
创建用户权限数据库
1.在 Microsoft SQL Server“程序”菜单上,单击“查询分析器”,然后连接到您的本地 SQL Server。
2.输入以下 SQL 脚本。
USE master
GO
-- 为安全信息创建一个数据库
IF EXISTS (SELECT * FROM   master..sysdatabases WHERE 
name = 'UserPopedom')
  DROP DATABASE UserPopedom
GO
CREATE DATABASE UserPopedom
GO
USE UserPopedom
GO
CREATE TABLE [Users] (
  [UserID] [varchar] (40) NOT NULL ,
  [UserName] [varchar] (255) NOT NULL ,
  [UserGroup] [varchar] (10) NOT NULL,
  CONSTRAINT [PK_Users] PRIMARY KEY  CLUSTERED
  (
    [UserID]
  )  ON [PRIMARY]
) ON [PRIMARY]
GO
将用户添加到数据库中

创建一个添加用户的Web 应用程序
1.启动 Visual Studio .NET,然后创建一个名为 myWebApplication 的新的 Visual C# ASP.NET Web 应用程序。
2.使用解决方案资源管理器将 WebForm1.aspx 重命名为 AddUser.aspx。
3.向 AddUser.aspx 添加表 1 中列出的控件,创建一个简单的添加用户窗体。

表 1:Adduser.aspx 控件
 
控件类型 文本 ID   
标签 用户名: -   
标签 用户权限    
文本框 - txtUserID   
文本框 - txtUserGroup   
按钮 添加 btnAdd   
标签 - lblMessage    

使用 ADO.NET 在数据库中存储权限信息
private void StoreUserPopedom(int IUserID,string StrUserName,int IUserGroup)
  {
   string connString = "server = localhost;database=UserPopedom;UID=sa;pwd=123";
   string comString = "Insert Users (UserID,UserName,UserGroup) Values (" +IUserID+","+StrUserName+","+IUserGroup+")";

   SqlConnection myconn = new SqlConnection(connString);
   SqlCommand mycom =  myconn.CreateCommand();
   mycom.CommandText = comString ;
 
   try
   {
    myconn.Open();
    mycom.ExecuteNonQuery;
   }
   catch(Exception e)
   {

    this.lblMessage.Text ="出现异常:"+e.Message;
   }
   finally
   {
    myconn.Close();
   }
  }

开发添加用户程序

1. 打开解决方案资源管理器,右击“引用”|添加引用 ,找到
   System.DirectoryServices.dll 单击 选择按钮,然后确定。如图3

1. 打开 AddUser.aspx.cs,并将下面的 using 语句添加到文件顶部的现有 using 语句的下面:
using System.Data.SqlClient;
using System.DirectoryServices;
2. 在AddUser.aspx.cs窗体,双击窗体中的“添加”按钮以创建一个按钮单击事件处理程序,加入以下代码。
bool  Flag = false;
string StrUserID = this.txtUserID.Text;
int IUserGroup = Convert.ToInt32(this.txtUserGroup.Text);
DirectoryEntry entryPC = new DirectoryEntry("WinNT://.");

foreach(System.DirectoryServices.DirectoryEntry child in entryPC.Children)    
{
if((child.SchemaClassName=="User") && (child.Name== StrUserID))
{
Flag = true;
break;
}
}

if (Flag==true)
{
StoreUserPopedom(StrUserID, StrUserID,IUserGroup);
this.lblMessage.Text = "Success!";
}
else
{
this.lblMessage.Text = "Fail!";
}

3. 还可以将windows用户一次性全部导入你的数据库。只需将以上代码换成:

   
   DirectoryEntry entryPC = new DirectoryEntry("WinNT://.");
 
   foreach(System.DirectoryServices.DirectoryEntry child in entryPC.Children)    
   {
    if((child.SchemaClassName=="User") )
    {
     //用户名和组都暂时置空。
     StoreUserPopedom(child.Name,"","");
    }
   }

 

身份验证程序
由于采用的Windows集成身份验证,所以身份验证工作不需我们处理,我们要做的只是取得当前登录成功的用户帐号,然后,根据用户权限数据库中对应的权限来决定用户的显示内容。
1. 打开AddUser.aspx.cs 加入如下代码:

private int GetUserPopedom(string StrUserID)
  {
   int IUserGroup;
   string connString = "server = localhost;database=UserPopedom;UID=sa;pwd=123";
   string comString = "Select UserGroup From Users Where UserID='"+StrUserID+"'";

   SqlConnection myconn = new SqlConnection(connString);
   SqlCommand mycom =  myconn.CreateCommand();
   mycom.CommandText = comString ;
 
   try
   {
    myconn.Open();
    IUserGroup = Convert.ToInt32(mycom.ExecuteScalar());
   }
   catch(Exception e)
   {

    this.lblMessage.Text ="出现异常:"+e.Message;
    return -1;
   }
   finally
   {
    myconn.Close();
   }
   return IUserGroup;
  }
2. 打开AddUser.aspx.cs,在页面加载处理程序中加入如下代码:

string StrUserID = this.Page.User.Identity.Name;
int IUserGruop = GetUserPopedom(StrUserID);
。。。
取得用户所属的权限组(这里的权限组是你自定义的),你就可以按照要求去显示页面的内容。

提供用户修改密码界面

表 2:changepassword.aspx 控件
 
控件类型 文本 ID   
标签 旧密码 -   
标签 新密码    
文本框 - txtOldpsd   
文本框 - txtNewpsd   
按钮 修改 btnOK   
标签 - lblMessage 


图 4 修改密码界面
1. 在Changepassword.aspx界面中,双击窗体中的“修改”按钮以创建一个按钮单击事件处理程序。
2. 在该方法中加入以下代码。

string oldPsw , newPsw;
string userName = this.Page.User.Identity.Name;
userName = userName.Remove(0, userName.LastIndexOf('//') + 1);
          
DirectoryEntry user = new DirectoryEntry("WinNT://./" + userName);  
oldPsw= txtOldpsd.Value;
newPsw= txtNewpsd.Value;

try
{
 user.Invoke( "ChangePassword", new object[]{oldPsw, newPsw});
     this.lblMessage.Text = "成功修改密码"
}
catch
{
 this.lblMessage.Text = "修改密码失败"
};

最后,Windows集成身份验证要注意的事项:
1.如果用户拥有的是个人计算机, 那么建议您在首次登录的时候钩选 “记住我的密码”复选框,下次登录时便不会出现登录框。如图 5
2.如果您使用的是公用计算机,切忌 请不要钩选此项,以防他人冒充,造成不必要的损失。
图 4 修改密码界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值