基于.net的安全性验证
2008-07-14李云唐歆瑜
李 云 唐歆瑜
摘要:采用自定义主体Principal和身份Identity实现基于窗体的安全验证,构建了一个灵活方便的安全权限管理系统,综合使用了数据库技术、面向对象设计技术、操作系统权限管理、NET框架中基于代码访问安全性和基于角色访问安全性等多方面技术。该方案可以用于多数WEB系统中,作为通用的安全权限管理模块。
关键词:身份验证;自定义主体;自定义身份
中图法分类号:TP311文献标识码:A文章编号:1009-3044(2008)01-10ppp-0c
Securit Authentication Base on .NET
LI YunTANG Xin-yu
(Changsha Aeronautic Vocational and Technical College, Hnnan Changsha 410124, China)
Abstratct: This paper presents an approach for constructing a flexible and convenient Security Management system based on form securit authentication of self-defined principle and identify,combining with database technology,object-oriented design,operating system privilege management,code-based and role-based security access in .NET technology.This new idea can be used in most of Web systems as a universal security privilege management module.
Key words: Identification and Authentication; self-defined principal; self-defined identif
安全认证是一个复杂而关键的问题,对于WEB应用程序开发,通常在窗体登陆时实现认证的操作。安全的含义既包括不允许非授权用户访问特定资源,也包括允许授权用户方便地访问授权资源。验证是授权的关键部分。在允许或拒绝用户的权限之前,首先必须知道用户的身份。.NET框架使用身份(identity)和主体(principal)对象代表用户。主体对象对应于一个用户,并且包含代表该用户细节的身份对象。可以将用户分类为不同的组或角色(role),如管理员和用户。
在ASP.NET授权中,有URL、文件、编码等授权方式,最为灵活的方面是通过编程给用户授权的能力。本文设计了一种通用的、基于数据库的、可以灵活应用的WEB系统用户验证与授权方案。
1 总体设计
.NET 基于角色安全性验证的核心是主体(Principal)和标识(Identity)对象,其中主体负责角色或者组的验证,标识对象封装了有关正在验证的用户或实体的信息。角色安全性验证通过生成可供当前线程使用的主体信息来支持授权,其中主体用关联的标识进行构造。验证用户后对其进行授权,授权允许细致地定义角色和方法,这些角色可利用这些方法与应用程序的操作或资源进行交互。验证涉及允许访问,而授权则精确定义了允许哪些访问内容。
要实现基于Form的身份验证流程,需要做如下几项工作:1)修改Web.Config文件;2)在登陆文件(比如login.aspx)中将用户信息写入cookies并加密;3)在Global.asax文件的Application_AuthenticateRequest事件中取得用户身份;4)在需要授权才能访问的资源页面检查用户授权。
图1 ASP.NET安全性处理流程
2 数据库设计方案
数据库表设计见图2,Accounts_PermissionCatego为许可类别表,表示了“横向”的功能,比如一个网站有多个栏目或多个频道,就可以划分多个许可类别。一个用户可以授予多种角色,一个角色可以包含多个用户;一个角色可以拥有多种许可;一个许可可以被授予多个角色。通过这样设计,可以非常灵活的给用户授权。Accounts_Permissions为许可列表;Accounts_RolePermissions为角色许可表;Accounts_Roles为角色表;Accounts_UserRole为用户角色表; Accounts_Users为用户表;
图2 数据库关系图
3 业务逻辑层
SitePrincipal对象是实现了IPrincipal接口的类的实例,这些对象用来表示用户,并且包括了用户的身份信息。System.Security.Principal命名空间包括了几种类型的Principal类,这些类中封装了程序代码运行的的安全环境(security context)。
声明授权允许在类层次中和单独的方法、属性或事件上设置权限需求。通过设置属性来做到这一点,ASP.NET中内置的用户验证支持非常强大。它能够在Context(上下文)对象中自动生成一个名为User的属性,该属性允许用户访问各种信息,包括用户是否已经验证、所使用的验证类型,甚至还有用户名。.NET系统中的安全机制基于主题(Principal)的概念,Principal对象代表以其名义运行代码的用户的安全环境。低于主体级别的是身份(Identity),身份代表执行代码的用户。因此每一个主体都有一个身份。主体和身份用户WEB站点和远程主机传递证书。
由于Microsoft.Net没有提供一种从数据库获取许可级别的方式,所以要扩展NET系统中主体和身份的功能。分配给HttpContext.User 的对象必须实现IPrincipal接口,IPrincipal的属性之一是Identity,而Identity必须实现IIdentity接口,为此设计了两个类:SiteIdentity和SitePrincipal实现上述接口。类的详细说明如下:
class SiteIdentity: IIdentity
Name 当前身份名称
UserId 用户编号
Password 二进制格式的加密密码
TestPassword(string) 验证用户密码
Authentication 身份验证类别,返回”自定义身份验证”
IsAuthentication 当前身份是否为已经验证
classSitePrincipal: IPrincipal
Identity 获取当前主体的身份
IsInrole 当前主体是否属于某个角色
Permissions PermissionsId数组,许可列表
Roles 主体所属角色列表
ValidateLogin 验证登陆电子邮件和密码
HasPermission 主体是否具有某项许可
EncrptPassword 加密用户密码
4 主要技术实现
4.1 Web.Config设置
在配置文件Web.Config中把设置
<authentication mode="Forms" >
<forms
name="edaWebLogin"
path="/"
loginUrl="Accounts/Admin/Login.aspx"
protection="All"
timeout="30">
</forms>
</authentication>
4.2 全局应用程序Global.aspx.cs代码
public void Application_AuthenticateRequest(Object sender, EventArgs e )
{//尝试对使用进行身份验证时激发
if (HttpContext.Current.User!=null)
if (HttpContext.Current.User.Identity.IsAuthenticated)
if ((HttpContext.Current.User.Identity) is FormsIdentity)
{ FormsIdentity Id = HttpContext.Current.User.Identity;
String useremail = Id.Name.ToString();
SitePrincipal newUser= New SitePrincipal(useremail);
HttpContext.Current.User = newUser;}
}
4.3Accounts/Admin/Login.aspx用户提交事件
private void Click(Object sender, EventArgs e)
{ SitePrincipal newUser =
_SitePrincipal.ValidateLogin(EmailAddress.Text, Password.Text);
if( newUser = =null)
{LoginResult.Text = "登陆失败 " && EmailAddress.Text;
LoginResult.Visible = True;}
else
{Context.User = newUser;
FormsAuthentication.SetAuthCookie(EmailAddress.Text, True);
Response.Redirect("Default.aspx");}
}
4.4 验证用户身份
//验证用户是否具有书籍管理功能
protected void Page_Load ( System.Object sender, System.EventArgs e)
{if (Me.IsPostBack == False)
if (! Context.User.Identity.IsAuthenticated
|| ! ((_SitePrincipal).HasPermission((int)(bookShopPermissions.书店管理)) Context.User, )
Response.Redirect("../../Accounts/Admin/Login.aspx?ShowError=true", True);
……}
}
5 NTFS文件管理及强名称程序集
ASP.NET中有两种基本的用户授权方法:基于角色的方法和基于资源的方法。基于资源的授权是特定于具体的资源,并且特定于底层操作系统或网络上的用户或组。在Web内容文件上设置受限制的NTFS权限,增强应用程序的安全性。一个网站的多个栏目管理中,其中最重要的、最需要安全保护的模块无疑是“管理人员”管理模块。本系统中管理用户模块包括如下功能:创建新用户、删除用户、创建角色、删除角色、创建许可、删除许可、创建许可类别、删除许可类别,给角色分配许可,给用户分配角色等等功能。为了重点保护该模块功能,该模块所在文件夹可以通过操作系统NTFS文件管理功能设置权限,由网络管理员设定只有特定用户(受信任的)才能访问该文件夹。
如果在web.config文件中存储证书,使用MD5或SHA-1哈希实现加密,.NET框架提供的代码访问安全性,可以减小恶意代码或包含错误的代码滥用本系统的代码的可能性。代码访问安全性还有助于最大限度地减少由于代码中的安全脆弱性而造成的损害。为此使用强名称对程序集进行签名。步骤为:
在NET工具命令提示下,使用sn.exe工具创建密钥对,例如:sn -k myKey.snk,该命令创建了密钥文件myKey.snk。使用强名称为程序集签名,在要签名的程序集文件AssemblyInfo.cs中添加:
6 结束语
本文采用ASP.NET开发的WEB应用程序,构建了一个灵活方便的安全权限管理系统,综合使用了数据库技术、面向对象设计技术、操作系统权限管理、NET框架中基于代码访问安全性和基于角色访问安全性等多方面技术,提供了基于Form的应用程序安全验证。该方案可以用于多数WEB系统中,作为通用的安全权限管理模块。
参考文献:
[1] 麻昌德,易高翔.使用ASP.NET/Web服务实现新闻发布系统[J].计算机应用与软件,2004(10):42-43.
[2] Dave Sussman,Alex Homer著,王毅译.ASP.NET高级编程[M].北京:清华大学出版社,2002.
[3] 花振峰,杨伟民,张生..NET组件和COM组件的应用集合研究[J].电子工程师,2005(2):71-73.
收稿日期:
作者简介:李云(1973-),女,山东青岛人,讲师,硕士研究生,研究方向:软件工程。