Project Web Access 2007自定义FORM验证登录实现
背景:
Project Server 2007安装后生成的WEB管理网站Project Web Access默认采用Windows验证,并自动将安装时登录系统的计算机管理员指定为Project Web Access的超级管理员,默认端口为80。若安装PWA的计算机机器名为PWAServer, 则可以通过http://PWAServer:80来访问PWA。目前情况是PWA需要在非域环境下使用,用户账户和密码需要使用已有系统用户数据库中的用户名和密码,实现PWA登录用户与已有系统用户的统一管理。
经过阅读资料了解到PWA支持FORM验证机制(事实上是SharePoint Server 3.0支持Windows验证和Form验证,而PWA是基于SharePoint Server 3.0实现的一个SPS网站),该验证机制基于微软的Membership用户管理与登录框架,微软已提供了一个默认的实现,称为SqlMembershipProvider, 通过简单地修改PWA的web.config,并运行几个配置程序,就可以让PWA支持FORM验证(配置过程网上有很多文章讲到)。微软默认实现的缺点是登录用户的用户名和密码信息必须存储在微软默认生成的SQL Server数据库中,而不能自定义存储位置,这显然不能满足之前的要求。
微软的默认实现不能支持用户名密码的自定义存储,看来只有重新实现一个MembershipProvider。后来经过查阅Membership SDK和相关的SPS资料,通过开发自己的MembershipProvider,结合SharePoint Server的配置,最终实现了PWA的FORM验证和自定义的用户来源。具体步骤如下:
一、配置Form Authentication Based PWA网站
要让PWA支持FORM登录,SharePoint Server的做法是生成与原网站一摸一样的一套网站,更改新网站的验证方式为允许匿名登录和FORM登录,新网站和原网站页面相同,访问的内容数据库也相同,只是配置的登录模式不同,从而实现同一个PWA,两种登录模式。下面是PWA Form验证网站的配置过程:
1. 进入Share Point 管理中心网站,进入“应用程序管理”,点击“SharePoint Web 应用程序管理”下的“创建或扩展WEB应用程序”,选择“扩展现有WEB应用程序”,进入扩展页面。
2. 界面中首先选择要扩展的Web应用程序,在这里我选择“Share Point – 80”网站,对应的访问链接是http://PWAServer:80。
3. 选择新建IIS网站,端口填任意未使用的端口,也可以用默认提供的端口。这里我们选择填81;
4. 验证程序选择NTLM,选择允许匿名访问,安全套接字选择否。
5. URL此时自动变成了http://PWAServer:81, 区域选择Internet,确定并保存。
6. 进入“应用程序管理”,进入“应用程序安全性”下的“验证提供程序”;区域选择“Internet”,进入。
7. 验证类型选择“表单”,勾选启用匿名访问;
8. 成员身份提供程序名称填配置文件中配置的MembershipProvider名,此处我们填CIMCMember(也可以是其他名称)。
9. 角色管理器名称留空。
10. 点击保存按钮保存。
至此我们完成了PWA Form验证网站http://PWAServer:81的配置,但该网站到目前为止还不能访问,还需要为它开发MembershipProvider适配器,将我们自定义的用户名密码数据库同PWA连接起来。下一步我们来做这个事情。
二、开发MemberShipProvider适配器
微软的Membership框架基于接口和面向对象设计,扩展Membership Provider首先需要继承虚基类System.Web.Security.MembershipProvider。MembershipProvider实现了若干公共方法、同时也定义了若干虚方法,需要子类来实现它。这些方法主要完成从用户库增删改查用户信息、用户密码信息、验证登陆用户、用户锁定和找回密码等功能。对于PWA的Form登录,最终只调用到适配器的一个方法,即
// // 摘要: // 验证数据源中是否存在指定的用户名和密码。 // // 参数: // username: // 要验证的用户的名称。 // // password: // 指定的用户的密码。 // // 返回结果: // 如果指定的用户名和密码有效,则为 true;否则为 false。 public abstract bool ValidateUser(string username, string password);
这个方法接收登录用户输入的用户名和密码,返回是否成功登陆的布尔值。很显然,我们只要在这个函数中写自己的验证逻辑,从自己的用户数据库中检索用户名和密码就可以实现登录用户名和密码的对接。具体实现略。
在实现自定义MembershipProvider的过程中,还可以对某些属性进行重载,以控制Membership的某些细节功能,例如:
Int MinRequiredPasswordLength 控制最小输入密码长度,可根据实际情况返回长度
bool EnablePasswordReset 是否允许重置密码。如果返回值为true的话,还需要重载相关重置密码的函数。
bool EnablePasswordRetrieval 是否允许用户找回密码。如果返回值为true的话,还需要重载相关找回密码的函数。
对于其他用不到的方法和属性,直接throw new Exception("The method or operation is not implemented.");
三、配置文件修改
自定义MembershipProvider开发好后,需要配置到PWA中才能使用,以下是配置步骤:
1. 将自定义MembershipProvider编译后形成的dll,连同该dll依赖的其他dll一起,拷贝到http://PWAServer:81网站的bin目录中(默认是C:\Inetpub\wwwroot\wss\VirtualDirectories\81\bin)。
2. 修改http://PWAServer:81网站的web.config文件加入以下配置信息:
在<system.web>节中增加红色部分,代码安全策略配置节
<securityPolicy> <trustLevel name="WSS_Medium" policyFile="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_mediumtrust.config" /> <trustLevel name="WSS_Minimal" policyFile="C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_minimaltrust.config" /> <!--自定义安全级别--> <trustLevel name="Full" policyFile="internal"/> </securityPolicy>
将<system.web>节中的trust安全策略节替换成红色部分
<!--<trust level="WSS_Minimal" originUrl="" />--> <trust level="Full" originUrl="" />
以上两个节修改了PWA的代码加载安全策略,保证了PWA能正常加载我们开发的代码。
在<system.web>节中增加自定义MembershipProvider配置节:
<!--自定义membership配置节--> <membership defaultProvider="CIMCMember"> <providers> <add name="CIMCMember" type="Hnas.Net2.PWAExtention.Membership.ImpMembershipProvider, Hnas.Net2.PWAExtention.Membership" portalAppName="CIMCPortal" /> </providers> </membership>
注意:本节中的配置的Provider name是CIMCMember,必须与第一节中“验证提供程序”配置中指定的成员身份提供程序名称相同,PWA通过此名称来查找和加载MembershipProvider。
3. 向web.config配置文件添加MembershipProvider依赖的其他配置信息,例如访问数据库时用到的数据库访问框架配置信息,连接字符串配置等。此处添加的是我公司自己的数据库访问框架配置信息
<section name="hnas.databaseSettings" type="Hnas.Application.Data.Configuration.DatabaseSettingsSection, Hnas.Application.Data, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
<!--数据库连接字符串--> <hnas.databaseSettings> <add name="IMPPortalServerDB" type="Hnas.Application.Data.SqlClient.SqlDatabase, Hnas.Application.Data, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" connectionString="data source=10.2.57.64\cimcbase;user=user;pwd=hnas_95071000;database=PortalServer" /> </hnas.databaseSettings>
4. 重复以上三步,将dll和配置信息同时添加到http://PWAServer:80网站的目录和配置文件中去。
四、Form登录用户添加
与windows验证环境下添加PWA访问用户相同,只有在PWA中建立了相应的用户映射,对应的来自自定义用户库的账号才能够登录PWA。添加PWA FORM验证用户的过程如下:
1. 访问windows验证版本的PWA( http://PWAServer:80/pwa)。
2. 进入服务器设置->管理用户,选择新建用户。
3. 勾选“可将用户作为资源分配”,可以让添加的用户直接成为PWA企业资源;
4. 填写显示名称,邮件等基本信息;
5. 用户身份验证选择“使用完全限定成员身份提供程序用户名(MembershipProvider:UserAccount)进行 Forms 身份验证”,用户登录账户填写的格式为MembershipProvider:UserAccount, MembershipProvider为配置文件中配置的成员身份提供程序名称,UserAccount为自定义用户数据库中的登录账号。此处我们的项目中填的是CIMCMember:youxin;
6. 填写其他非必填内容,勾选权限选项,为用户指定PWA使用权限。勾选的时候还可以使用“使用模版设置权限”功能,快速选择预定义角色包含的权限范围;
7. 点击“保存”创建用户。
至此,我们已经创建了名为CIMCMember:youxin的FORM登录用户,该用户与我们自定义用户库中的账号youxin相关联。
当我们访问PWA FORM验证网站http://PWAServer:81/pwa下的任意页面时,系统会首先转到登录页面,要求输入用户名和密码。此时输入的用户名只能使用注册用户时输入的用户账号的后半部分,即注册时用的是CIMCMember:youxin,登录时应使用youxin。