现在的位置: 首页 > 综合 > 正文

考察ASP.NET 2.0的Membership, Roles, and Profile – Part 7

2013年12月04日 ⁄ 综合 ⁄ 共 5083字 ⁄ 字号 评论关闭

本文英文原版及代码下载:
http://aspnet.4guysfromrolla.com/articles/101806-1.aspx

考察ASP.NET 2.0的Membership, Roles, and Profile - Part 7

导言:

在前6章我们考察了.NET Framework包括的那些provider——比如SqlMembershipProvider, SqlRoleProvider, SqlProfileProvider等.实际上

我们可以下载这些provider的源代码,以及一个Provider工具包来创建我们自己的provider(http://msdn2.microsoft.com/en-

us/asp.net/aa336558.aspx),而Scott Guthrie在他的博客文章《ASP.NET 2.0 Membership, Roles, Forms Authentication, and Security

Resources》(http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-

Authentication_2C00_-and-Security-Resources-.aspx)里列出了很多自定义的Membership, Roles, and Profile provider.

如果这些内置的provider无法满足你的需要,你可以创建自己的provider.本文,我们将探讨创建和使用一个自定义provider,然后用一个简单

的自定义provider将profile信息存储到一个XML文件里.

Profile System的职责

像在Part 6探讨的一样,Profile System允许用户在Web.config文件定义一系列的 "profile properties",然后在某些存储备份(backing

store)里保存和读取这些属性值.

如果这些内置Profile providers不能满足需要,你可以创建你自己的provider。创建一个用户定制provider——不管是用于Profile,

Membership, Roles, ASP.NET site map,或是其他的什么子系统,都有遵循如下的步骤:

1.创建用户定制provider——创建源自ProfileProvider class类的一个类.

2.设置应用程序使用用户定制provide——我们需要在Web.config文件里指定Profile system使用我们的定制provid而不是默认的

SqlProfileProvider。

微软的Provider Toolkit web page页面里有关于学习创建用户定制provider的信息.对Profile system而言,有2个文件值得阅读:

《Introduction to Profile Providers》——它介绍了Profile system的概念以及职责;而《ASP.NET 2.0's Profile Providers》——它更

直观的介绍了 in ASP.NET 2.0里的SqlProfileProvider是如何贯彻的.

本文的剩下部分我们将探讨我们自定义的XmlProfileProvider——将用户信息装入App_Data文件夹里的一个XML文件,完整代码(以及简单的测

试程序)在本文的下载代码里.

设计XmlProfileProvider

默认,Membership, Roles,Profile system的provider都被设计为多个应用程序存储信息.明显的例子就是aspnet_Applications表,每一个应用程序实例对应一条记录.系统里的每一个用户通过aspnet_Users表里的ApplicationId这个外键与某个应用程序联系起来.我决定将该功能应用到我们的profile provider里(对XmlProfileProvider来说,Membership 和 Roles providers都可以使用它).Profile数据默认时存储在App_Data文件夹里的一个文件里,以阻止用户从浏览器直接请求这些文件(如果一个用户试图从浏览器访问http://www.yoursite.com/App_Data/anyFile 的话,ASP.NET会返回一个HTTP 404消息)。不过你也可以通过 provider的profileFolder设置来指定XML文件存放在什么地方.

具体来说,Profile数据以如下形式进行存储:~/App_Data/XmlProfiles/applicationName/username.xml.每一个XML文件开始为一个<profileData>根元素,而子元素就由定义在Web.config文件里的Profile属性里决定了。

就像在Part 6探讨了一样,Profile属性可以为strings, XML,或binary数据,对string类型的属性而言,XML文件将其保存为文本形式;如果是XML类型则原封不动的保存;如果是binary类型的就保存为64位编码的binary.假设我们在Web.config文件<properties>元素里定义了6个Profile属性:

<profile defaultProvider="...">
   <providers>
      ...
   </providers>

   <properties>
      <add name="Birthdate" type="DateTime" serializeAs="String" />
      <add name="HomepageUrl" type="String"/>
      <add name="Signature" />
      <add name="IncludeSignatureInPosts" type="Boolean"/>
      <add name="BillingAddress" type="Address" serializeAs="Xml" />
      <add name="ShippingAddress" type="Address" serializeAs="Binary" />
  </properties>
</profile>

其中的Address类型是定义在App_Code文件夹里的一个简单类,包含了些标量属性,比如:Address1, Address2, City等.注意:Profile属性BillingAddress序列化为XML,而ShippingAddress为binary.

对于上面定义的Profile属性,如果有个叫"Jisun"的用户登录我们的网站,使用Profile system,且应用程序的名称为"MyApp",那么将会创建一个~/App_Data/XmlProfiles/MyApp/Jisun.xml的文件,其包含的代码可能为:

<?xml version="1.0" encoding="utf-8"?>
<profileData>
  <IncludeSignatureInPosts>False</IncludeSignatureInPosts>
  <Signature>What is life, but a seemingly random collection of 1s and 0s?</Signature>
  <HomepageUrl>http://www.datawebcontrols.com</HomepageUrl>
  <Birthdate>1979-04-01</Birthdate>
  <ShippingAddress><![CDATA[AAEAAAD/////AQAAAAAAAAAMAHBfQ29kZS5j...]]></ShippingAddress>
  <BillingAddress>
    <Address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Address1>123 Anywhere St.</Address1>
      <Address2 />
      <City>San Diego</City>
      <State>CA</State>
      <ZipCode>92109</ZipCode>
    </Address>
  </BillingAddress>
</profileData>

就像你看见的那样,每个Profile属性被处理成一个XML元素并作为<profileData>根元素的子元素. 对string类型的属性,比如IncludeSignatureInPosts, Signature, HomepageUrl,以及Birthdate,其值在XML元素里为文本值;对XML类型的属性(BillingAddress),其值在<BillingAddress>元素里保存为原始形式;binary类型的属性ShippingAddress被编码为64位.

规划XmlProfileProvider Class类

当构建用户定制Profile provider时,我们要扩充System.Web.Profile.ProfileProvider class类.至少要包含2个方法——GetPropertyValues(context, collection) 和 SetPropertyValues(context, collection).这2个方法都接受2个输入参数——context 和 collection. 其中context提供的信息为:用户名以及该用户是否经过认证(ASP.NET支持匿名profile,不过这超出了本文的范围,更多信息请参阅文章《Profiles section on the ASP.NET Quickstarts 》(http://dotnetjunkies.com/QuickStartv20/aspnet/doc/profile/default.aspx#anon));另外collection提供一系列的Profile属性.

上面的GetPropertyValues方法返回所需Profile属性的值,相反SetPropertyValues方法的目的是向backing store(就本例而言,为XML文件)写入属性值.在ProfileProvider class类里还有其它的类,不过我们可以创建仅仅执行这2个方法的自定义profile provider.

在你的Website里使用XmlProfileProvider自定义Provider

为了在你的应用程序里使用自定义的XmlProfileProvider,我们首先要在本文结尾处下载其代码,将CustomProviders.dll放在你的web 应用程序的/bin目录,再更新你的Web.config文件:

<profile defaultProvider="MyCustomProfileProvider">
   <providers>
      <clear />
     
      <add name="MyCustomProfileProvider"
           type="CustomProviders.XmlProfileProvider, CustomProviders"
           applicationName="applicationName"
           [profileFolder="baseFolderPathForProfileXMLFiles"] />
   </providers>

   <properties>
      ...
  </properties>
</profile>

其中profileFolder属性是可选的,如果忽略的话,默认为~/App_Data/XmlProfiles/.

下载代码里包含了一个测试的web应用程序,指导如何将自定义的XmlProfileProvider class类与默认的SqlMembershipProvider class类协调使用.

结语:
在本文我们看到如何利用provider model来创建以用户自定义的Profile provider,它将用户属性设置保存为XML文件而不是一个数据库.

祝编程快乐!

 

抱歉!评论已关闭.