【IT168技术文档】
摘要
在这篇文章中,Masoud讨论了应用ASP.NET中统一身份验证模型进行跨应用程序验证的问题,包括:Membership Providers, web.config配置,配置文件的加密解密等。在文章的最后,作者提供了通过ASP.NET login controls来验证的程序。
简介
通常在你要实现ASP.NET web应用程序的身份验证时,你需要为你的每一个应用程序创建一个登录页面。想象一下,如果你有两个或者更多的互相关联的web应用程序,你可能希望通过某种机制为你的所有带关联的应用程序实现仅出现一次登录页面。这样,一旦你登录了一次,你就可以浏览所有的关联程序,而不再需要额外的登录了。单点登录(SSO)就是这样的访问控制机制,它允许一个用户通过一次验证就可以访问所有软件系统资源。
试想你在你的服务器上创建了两个或者更多的web站点。就像其他的web站点一样,你只是使用ASP.NET权限验证机制来验证你的用户。那么,你的这些站点可能需要一个或更多的登录页面。现在你正试图证明怎么样通过更改你的配置来实现跨程序登录。换句话说,我们只想给我们的程序配置一个登录页面,并且一旦用户通过了验证,他就可以浏览其他所有的站点,而不需要另外的登录。在这篇文章的附录中,你也可以看到如何加密你的配置文件。
什么是单点登录?它是怎样工作的?
在许多的公司里,他们有一些以web站点或web应用程序为表现层的系统。自然,由于安全议题他们将需要通过基于ASP.NET 2.0,通过Membership Provider 和 Role Provider 或者定制实现权限验证和权限验证系统。不论怎样,所有的站点都会默认有一个确定用户的ID和密码在数据库中是否有效的”login.aspx” web窗体.当你只有一个站点或者这些站点都是独立运行时,这样做是没有问题的。但是当你有两个或多个站点,而且站点间是关联在一起或链接在一起的,你没准就会问:为什么每个应用程序你都必须登录一次?为什么你不可以只有一个”login.aspx”来实现验证,并让所有不关联程序真正统一起来。幸运的是,在ASP.NET 2.0中你可以通过同样的配置来实现跨应用程序访问,不论是你的新的站点还是已经存在的站点。
在ASP.NET配置文件(web.config)中有一个配置节(在<system.web中)命名为<machineKey>,负责加密和解密窗体(这些窗体可以读窗体权限验证cookies)权限认证的cookie数据和view-state数据,也负责校验进程外(out-of-process)session 状态标识。所以当用户一旦被验证通过并且有一个cookie保存到了本地计算机,其他拥有同样<machineKey>配置的应用程序也可以识别此cookie为有效的权限票据。所以在其他拥有同样<machineKey>配置的应用程序中就不再需要第二次登陆了。
由于<machineKey>信息是敏感的,你需要加密配置文件中的此节信息。为了实现这个目标,我将使用ConfigurationManager类和他的方法。这里还有一个类SectionInformation,包含有配置中单个配置节的元数据。此类中有个方法ProtectSection(),用来解密你的配置文件的配置节。
系统条件
· A web server running on Windows 2000 or later
· .NET Framework 2.0
· Visual Studio 2005
· Microsoft SQL Server 2005 Express Edition
现在让我们来看看在我们的项目中发生了什么。我有一个站点(Aspalliance1)站点中包含一个登录页面”Login.aspx”.用户可以通过此页来进行权限验证。在这个站点里还有一个页面叫做”Default.aspx”,它有一个header和一些文本另外还有一个到Aspalliance2站点的链接。你将会看到一旦这个用户登录了,他可以导航到其他站点而不需要第二次登陆。这里还有一个安置有两个加密和解密的按钮的页面”Encryption.aspx”,用来加密和解密配置文件。
就像我之前所说的那样,你可以通过在你的web配置文件中一点点小小的配置实现跨应用程序访问。在web.config文件中,有一个名为<system.web>的配置节。我们将对<system.web>做相同的配置,只需要将配置节<machineKey>和它的值放到<system.web>配置节中。<machineKey>有一些属性,我将要去配置他们。首先,就是指定用来验证的加密类型。validationKey 定义了用来验证解密数据的key,decryptionKey定义了用来加密和解密的数据的key,抑或是key生成的过程。
清单 1: 配置web.config中的machineKey
<machineKey validationKey="282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF 21B580D8587DB675FA02F79167413044E25309CCCDB647174D5B3D0DD9141" decryptionKey="8B6697227CBCA902B1A0925D40FAA00B353F2DF4359D2099" validation="SHA1"/>