论文部分内容阅读
摘要:采用自定义主体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)在需要授权才能访问的资源页面检查用户授权。
图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中把设置项中的mode属性设置为“Windows”、“Forms”、“Passport”或“None”,可以决定ASP.NET采用的验证模式。本文采用目前广泛应用于internet的窗体验证,即“Forms”身份验证模式。
<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 = "登陆失败 "
关键词:身份验证;自定义主体;自定义身份
中图法分类号: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)在需要授权才能访问的资源页面检查用户授权。
图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 = "登陆失败 "