考察ASP.NET 2.0Membership,Roles,Profile - Pa

系统 2052 0

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


考察ASP.NET 2.0Membership,Roles,Profile - Part 1


导言:

很多网站都有一个共同点:提供用户帐号(user accounts),这些网站允许(或需要)访问者创建帐号以使用特定的功能.比如ASPMessageboard.com网站,匿名用户和注册用户都可以使用搜索功能,但如果要发表文章或回复消息的话,访问者就必须获得用户帐号并登录网站.

一个支持用户帐号的网站,都要包括这些相同的步骤:创建一个数据库表来存储用户帐号信息;创建一个登录页面;定义一种系统,当页面回传时仍可保存注册用户的登录状态;指出哪些页面只对注册用户可见;创建一个新页面供新用户注册;创建一个页面便于网站管理员管理用户帐号等等.在ASP.NET之前,开发者必须决定如何贯彻这些方面。ASP.NET引入了forms-based authentication的概念,二楼提供了一个FormsAuthentication class类来便于在网站登录或注销.同样的还有authentication ticket,在页面请求时保存用户的登录状态。(关于ASP.NET的基于窗体的识别功能,请参阅文章《Using Forms Authentication in ASP.NET 》和《Dissecting Forms Authentication》)

即便有了基于窗体的识别功能,ASP.NET开发者仍然要定义并构建相应的结构来存储用户帐号信息;创建登录和注销的web页面;还有便于访问者创建新帐号和便于管理员管理帐号的页面等.感谢ASP.NET 2.0,利用其membership system 和 security Web控件,可以减轻开发者的负担.简单的说,membership是一个API,可以编程访问与用户帐户相关的任务.比如:有专门的方法创建一个新的用户帐户,识别用户身份,删除用户,返回所有的用户信息等.此外,还有很多建立在该API基础上的security Web控件.

本系列文章将考察2.0版本中的membership, roles,pofile系统,以及各种security Web控件.本文我们考察membership的基本原理并配置与使用内置的SqlMembershipProvider.


基于窗口的认证(Authentication)


在ASP.NET之前,web开发者必须自己定义所有的认证.一个问题是当页面请求时如何记住用户的登录状态,也就是说当用户输入用户名和密码并成功登录后,当用户访问其它页面时,网站如何记得该用户是否成功登录了?另一个问题是如何防止页面被未授权的用户访问,也就是说如何设置一个页面只能被一部分或被授权的用户访问?在经典ASP里我们通过使用Session变量来解决这些问题.每个页面检查该Session变量一确定访问者的身份,以及是否允许他们访问.

为此,ASP.NET 1.0版提供了对forms-based authentication的支持,同时可以在Web.config文件里指定authorization rules角色.forms-based authentication提供了一种方法将authentication ticket作为一个cookie存储在浏览器里,在发生web请求的时候记住用户的登录状态.而FormsAuthentication class类包含了很多方法来处理这些authentication ticket。可以创建它也可以删除它.

不幸的是forms-based authentication依然留给开发者很多工作.开发者仍然必须决定如何传递用户帐户信息;仍然必须构建登录页面并编写使用FormsAuthentication class类的代码;仍然必须构建注销页面;构建注册帐户页面;构建管理帐户的页面等等。ASP.NET 1.0版本引入forms-based authentication的初衷是好的,只是贯彻起来有难度.

在Forms-Based Authentication之上构建ASP.NET 2.0的Membership

Forms-based authentication依然存在于ASP.NET 2.0版本,使用方法与 1.x版本一样。同时在Web.config文件里也有authorization设置. ASP.NET 2.0版本增加的是membership API以及security Web控件.

membership API是通过provider模式来执行的.那就意味着当定义好界面后可以对实际的执行过程进行定制.而.NET Framework包含了Membership class类,该类包含可很多方法,比如 CreateUser(), GetAllUsers(), ValidateUser()等等. 然而,当通过一个ASP.NET web应用程序来使用API的时候实际调用的类取决于应用程序的配置.你可以定制你的用户帐户逻辑,方法是创建一个执行定义好的membership API的类,然后配置web应用程序来使用你定义的类.当然,你也用不着定义一个自定义的类——ASP.NET包含了2个内置的membership providers,一个将用户帐户信息存储在一个SQL Server数据库;另一个使用的是实际的目录.因此membership system 和 security Web控件都可以被这2个内置的providers使用.如果你确实自定义了用户数据,你也可以创建一个自定义的provider通过相同的API 和 security控件来使用这些自定义的用户数据.关于provider模式的更多信息,请参阅文章《A Look at ASP.NET 2.0's Provider Model》( http://aspnet.4guysfromrolla.com/articles/101905-1.aspx )
在本系列的后续文章里,我们将考察创建用户自定义的membership provider的详细步骤.


SqlMembershipProvider——将用户帐户数据存储在一个SQL Server数据库

ASP.NET 2.0 里的SqlMembershipProvider provider使用一个数据库来存储认证信息.为了使用该provider,你必须创建一个相应的数据库构架(schema).可以通过2种方法来完成:

1.使用ASP.NET网站管理工具(这将会在一个SQL Server 2005数据库文件ASPNETDB.mdf里创建构架,且位于App_Data文件夹)

2.使用ASP.NET SQL Server注册工具——使用该工具在一个SQL Server 2000 或 2005 数据库里创建构架.

考察ASP.NET 2.0Membership,Roles,Profile - Part 1

图1


要使用ASP.NET网站管理工具的话,首先在Visual Studio的Website菜单,选择“ASP.NET Configuration”项,然后在Security项里,将authentication类型改为"From the internet" 。具体方法是:要么点"Select authentication type"链接,要么点" "Use the security Setup Wizard to configure security step by step"链接.这样将自动在App_Data文件夹里创建一个名为ASPNETDB.mdf的数据库(我们马上将考察该数据库的构架).关于使用网站管理工具的更多详情请参阅文章《Website Administration Tool Overview》( http://msdn2.microsoft.com/en-us/library/yy40ytx0.aspx )

如果你大算将用户帐号信息存储在其它地方——比如App_Data文件夹之外的一个SQL Server 2000 或SQL Server 2005数据库. 那么你就需要使用ASP.NET SQL Server注册工具(aspnet_regsql.exe).该工具具有图像界面,当然你也可以通过命令行来使用它.你可以借助于图像界面指定在什么地方添加所需要的表.关于使用该工具的更多详情,请参阅技术文档( http://msdn2.microsoft.com/en-us/library/ms229862.aspx )

注意:
当你使用ASP.NET网站管理工具来将authentication类型设置为"From the internet" ,这将在Web.config文件里添加一行:

<authentication mode="Forms" />

如果你通过ASP.NET SQL Server注册工具来创建数据库构架的话,你必须手工向Web.config文件添加在行。此外,没有在App_Data文件夹里的ASPNETDB.mdf数据库里创建构架,而是在其它数据库创建的,那么你必须要在Web.config文件里定制membership配置,并指定连接数据库的连接字符串.

SqlMembershipProvider将用户帐户信息存储在下面2个表里:

.aspnet_Users -每一个用户帐户一条记录,存储最基本的信息.其UserId列唯一的标识用户身份.

.aspnet_Membership—该表的UserId列将该表与aspnet_Users表里的某条特定记录对应起来.aspnet_Membership表存储的是与用户帐号相关的数据: Email, Password, 安全提示问题以及答案等等.


定制SqlMembershipProvider


如果你希望使用SqlMembershipProvider的默认配置(那就意味着用户帐户信息存储在App_Data文件夹里的ASPNETDB.mdf数据库里),那么你除了在Web.config文件里指定使用到的窗体认证和授权角色(authorization rules)外,不需要做其它的更改.(对于窗体认证和授权角色问题,可以通过ASP.NET网站管理工具来指定。关于在Web.config文件里指定authorization配置的更多信息请参阅文章《 Authentication and Authorization》( http://samples.gotdotnet.com/quickstart/aspplus/doc/authandauth.aspx )和文章《Authorizing Users and Roles》( http://samples.gotdotnet.com/quickstart/aspplus/doc/authorization.aspx )

如果你打算使用另外一个数据库,或者说改变membership的某些配置(比如:email地址是否是唯一的;密码的最短长度; 密码是纯文本还是经过加密;安全提示问题和答案是不是必需的等等)的话,你就要在Web.config文件里手动输入XML模块来指定你自己的用户配置.(注意:你必须要为applicationName设置一个“硬编码”值,有关这方面的更多详情请参阅《Always set the "applicationName" property when configuring ASP.NET 2.0 Membership and other Providers》)

下面的XML代码显示了如何定制SqlMembershipProvider设置。具体来说,属于黑体字的XML在<membership>元素里对设置进行定制。在其上还有一个<connectionString>节点,提供了连接到数据库的连接字符串(我们可以推算出来,该数据库构架是使用ASP.NET SQL注册工具添加的) :

<configuration>
<connectionStrings>
<add name="MyDB" connectionString="..." />
</connectionStrings>
<system.web>
... authentication & authorization settings ...

<membership defaultProvider="CustomizedProvider">
<providers>
<add name="CustomizedProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="MyDB"
applicationName="ScottsProject"
minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0" />
</providers>
</membership>
</system.web>
</configuration>

ASP.NET 2.0包含了一个内置的名为LocalSqlServer的连接字符串,它指向 App_Data文件夹里的ASPNETDB数据库.如果你希望使用默认的ASPNETDB数据库,并只改变一些属性.将connectionStringName配置为LocalSqlServer.

在<membership>元素里添加一个名为CustomizedProvider的新provider,并作为默认的membership provider.该自定义provider仍然使用SqlMembershipProvider ;将connectionStringName设置为MyDB(就是在<connectionStrings>节点指定的);将applicationName设置为ScottsProject;将minRequiredPasswordLength设置为5;将minRequiredNonalphanumericCharacters设置为0.我们只是对很少的属性进行自定义设置,全部属性清单见《<add> Element for Providers for Membership》。


Security Web控件的简单概述


Security Web控件为处理与用户帐户相关的的任务提供了一个用户界面.主要包括7种security user控件:

Login控件——该控件呈现为标准的username/password登录界面.默认下,当用户点击"Login"按钮时,立即产生页面回传,控件调用Membershipclass类的VerifyUser(username, password)方法来对用户进行验证,如果验证通过则为用户创建一个authentication ticket,否则显示一个出错信息.

为LoginError event事件创建事件处理器,便于当用户为通过验证时自定义处理步骤;为Authenticate event事件创建事件处理器,以执行你个人的验证逻辑;Login控件包含了很多的属性供配置,以改变用户界面的外观.要完善控件,可以使用LayoutTemplate,下面的截屏为Login控件的默认用户界面:

考察ASP.NET 2.0Membership,Roles,Profile - Part 1
图2

LoginView控件:有时我们希望根据访问者是匿名用户还是登录用户来显示不同的内容:比如,当一个匿名用户访问主页时你可能希望显示一个Login Web控件,而如果是一个登录用户的话,我们希望显示一个消息,比如:"Welcome back, username" ,再附加一个注销的链接.

LoginView控件提供了2个模板:AnonymousTemplate 和 LoggedInTemplate模板.将显示给匿名用户的Web控件和HTML标记放在AnonymousTemplate模板里;而将显示给登录用户看的放在LoggedInTemplate模板;此外该控件还可以根据登录者角色的不同显示不同的界面.

PasswordRecovery控件-允许用户重新获取现有的密码或将一个新密码传递到用户的电子邮件地址.如果密码在存储时经过哈希算法处理,那么“重新获取”密码实际上是创建一个新的随机的密码,再送回给你.如果密码是纯文本或经过加密处理,那么将把现有密码送回给用户.

LoginStatus控件—如果是匿名用户,该控件将显示一个转到登录页面的连接;如果是登录用户将显示一个注销链接.

LoginName控件——该控件仅仅将登录用户的username显示出来。另外,可以通过User.Identity.Name,编程访问用户的名称.

CreateUserWizard控件——除了登录的页面外,我们还需要一个供访问者注册的页面。而CreateUserWizard控件就提供了创建用户帐号所需的用户界面,当用户输入必需的数据并点"Create User"按钮时,将调用Membership class类的 CreateUser(...)方法.如果需要的话,可以用templates对CreateUserWizard控件进行定制.下面的截屏为运行中的CreateUserWizard控件.

考察ASP.NET 2.0Membership,Roles,Profile - Part 1
图3

同样可以对CreateUserWizard控件的布局和参数进行定制,详情见《Customizing the CreateUserWizard Control》( http://aspnet.4guysfromrolla.com/articles/070506-1.aspx )

ChangePassword控件——该控件允许用户改变其密码


所有的security Web控件在使用的时候可以不用写一行代码。比如你要创建一个登录页面,你只需要创建一个Login.aspx页面并拖一个Login控件到页面上。瞧,就这么简单,不用写一行代码。此外security Web控件包含了丰富的事件模型,你可以编程处理各种不同的事件.在本文的下载内容里包含了几个页面演示如何使用这些控件.

编程使用Membership System

可以通过Membership class类来使用membership system的函数,比如: GetAllUsers(), CreateUser(), DeleteUser()等等.你可以通过security Web控件在使用这些方法,也可以直接从ASP.NET页面调用这些方法.比如你可以创建一个页面来列出所有的用户,方法是将Membership.GetAllUsers()返回的结果绑定到一个GridView控件上。在本文下载内容里有几个编程使用Membership class类的示例.

结语:

由于很多网站需要用户帐号支持,所以ASP.NET对该功能的支持是很有意义的.不过在ASP.NET 1.0版本里面,本目标只达到了一半。虽然基于窗口的验证提供了标准的手段包含一个authentication ticket来维系用户的登录状态,但无法存储用户帐户信息或创建必要的web页面(比如:登录、创建帐户等等)。在2.0版本,ASP.NET包含了membership服务和一些security Web控件.以弥补1.x版本的不足.

在本文,我们考察了membership system的注意目标,一个其中一个内置的membership providers——SqlMembershipProvider.该SqlMembershipProvider将用户帐户信息存储在一个SQL Server数据库,我们也可以通过Web.config文件对其进行用户定制。此外我们还总览了ASP.NET的security Web控件.它用来执行登录、创建用户帐户,以及其他与用户帐户相关的用户界面元素.

除了membership system外,ASP.NET 2.0还包含了roles 和 profile system.我们将在后面的文章探讨它们.

祝编程快乐!

考察ASP.NET 2.0Membership,Roles,Profile - Part 1


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论