`

ASP.NET服务器控件

阅读更多

 

7.登录控件

 

在使用登录控件之前,必须先了解一下成员(Membership)和角色(Role)管理技术。在ASP.NET3.5中,提供了一整套用

于管理用户的方法和属性的Membership API,而基于Membership API的登录控件可以简化重复创建用户登录和管理机

制的繁琐。使用Membership API可以完成的用户管理任务有(1.通过编程或在Web.config文件中创建,删除用户。2.

验证用户,重置用户密码,可以自动发送重置密码邮件。3.可以自动生成密码,并将该密码发送到邮箱。4.可以查找数

据源中已经创建的用户或用户列表,为用户赋予角色。5.一套预置的登录和注册控件简化了使用Membership API的过

程。6.完全一致的编程模型,不用管理数据存储的细节,默认使用SQLServer2005存储用户和角色)

Membership API是存储独立的,用户信息可以存储在XML文件也可以存在SQLServer或Olacre及其他自定义存储里。

Membership API通过与这些不同数据源的成员提供者(如ASP.NET默认的SqlMembershipProvider和

ActiveDirectoryMembershipProvider)来操作数据源里的用户信息。对于ASP.NET开发人员来说,主要使用登录控件

和Membership类(其提供了一套静态方法和属性用于访问数据源中存储的用户和角色)。而所有与Membership API相

关的类都位于System.Web.Security里。

 

使用Membership API。单击VS2008的"项目|ASP.NET配置"菜单项打开ASP.NET网站管理工具来配置:

(1)配置表单身份验证 。"安全"--"选择身份验证类型",选择"通过Internet"就可打开Forms身份验证。如果要为某

文件夹授权,就"创建访问规则",就可以选中某一文件夹然后指定哪些用户可以访问该文件夹哪些用户不能访问该文

件夹了,设置完后在该文件夹下就会多一个web.Config文件专门配置该文件的(一个APS.NET程序可以有不只一个

Web.config文件,这里的称为子Web.config,网站跟目录下的是根Web.config,它们的设置级别是子web.config优先),

创建完后,还有个"管理访问规则"用来修改所创建的访问规则。

(2)创建Membership数据存储。默认情况下ASP.NET使用SqlMembershipProvider作为成员提供者,使用SQLServer2005

作为数据库存储。而ASP.NET网站管理工具就使用AspNetSqlProvider来用以上俩个东东配置Membership数据存储,而

默认数据库为ASPNETDB.MDF(显示所有文件后在App_Data文件加中能看到)。该数据库里有很多表和存储过程用于存

储和管理用户信息,我们可以将这些表和存储过程加到我们ASP.NET程序使用的那个数据库里。方法:在VS2008的命令

提示窗口中输入Aspnet_regsql.exe,然后根据向导选择那个数据库(服务器名要填完整实例名),之后会在该数据库里

看到那些以aspnet开头的表了,当然向导里还有一个移除这些表和存储过程的选项,方法大致一样。

(3)配置MembershipProvider和数据库连接。创建好数据存储后,先在根Web.config里将连接字符串指向我们web程序

用的那个数据库,然后再在根Web.config的<system.web>节点内添加<membership>节点来配置成员提供者:

<membership defaultProvider="MyFirstMemberShipSqlProvider" userIsOnlineTimeWindow="15" 

hashAlgorithmType="">

      <providers>

        <clear/>

        <add name="MyFirstMemberShipSqlProvider" type="System.Web.Security.SqlMembershipProvider" 

connectionStringName="newsystemConnectionString" applicationName="/" passwordFormat="Hashed" 

minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="4" 

passwordStrengthRegularExpression="" enablePasswordReset="true" enablePasswordRetrieval="false" 

maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" requiresQuestionAndAnswer="true" 

requiresUniqueEmail="false"/>

      </providers>

    </membership>

看到在<providers>里添加了一个成员提供者名字是MyFirstMemberShipSqlProvider并且<membership>的 

defaultProvider="MyFirstMemberShipSqlProvider"这样我们的web应用程序将使用此成员提供者,还可以在

<providers>里添加多个成员提供者,然后ASP.NET网站管理工具的提供程序里或<membership>的defaultProvider里

指定使用哪个成员提供者。

成员提供者里的属性意思是:

name(成员提供者的名字)applicationName(指定应用程序的名称,该设置可以将不同的应用程序的成员提供者都设置

为此成员提供者)passwordFormat(获取或设置用户密码的格式,Clear:纯文本存储Encrypted:加密存储Hashed:哈希

码加密存储)minRequiredNonalphanumericCharacters(密码中必须包含的最少特殊非字母字符数)

minRequiredPasswordLength(密码的最小长度)passwordStrengthRegularExpression(验证密码复杂性而使用的正则表达式)enablePasswordReset(是否允许重置密码)enablePasswordRetrieval(设为true的话,可以调用GetPassword方法获取密码)maxInvalidPasswordAttempts(密码或密码答案尝试次数)passwordAttemptWindow(获取时间长度,在该时间间隔内对有效密码或密码答案的连续失败尝试次数进行跟踪)requiresQuestionAndAnswer(在进行密码重置和检索时是否回答密码提示问题)requiresUniqueEmail(是否每个用户要求Email地址唯一)

现在可以在ASP.NET网站管理工具下的"安全"里创建一个用户了。创建后用户的ID信息保存在了aspnet_Users表,密

码信息保存在了asp_Membership表。

 

现在我们就来使用ASP.NET内置的一套登录控件,这些控件依赖于Forms身份验证和Membersship API基础设置,它们都

有相同的工作方式:如果不响应任何控件的自定义事件,则控件将使用默认的membership API来处理。如Login控件支

持Authenticate事件,如果不处理这个事件,将自动使用web.config中配置的membership API来验证用户,如果响应了

该事件,则需要提供自定义的用户验证过程。

1.Login控件

属性DisplayRememberMe(是否显示记住我复选框Cookie)RememberMeText(记住我文本)TitleText(标题文本)

InsertuctionText(说明文本,位于标题文本后)DestinationPageUrl(验证成功后定向到的页面)

CreateuserText(创建用户文本)CreateUserUrl(创建用户的Url)FailureAction(Refresh:刷新页

RedirectToLoginPage:重定向到登录页)FailureText(失败时文本)Oritentation(布局样式)

PasswordRecoveryUrl,PasswordRecoveryText,PasswordRecoveryIconUrl(显示密码恢复连接的话)

VisibleWhenLoggedIn(登录后是否显示)

如果对现在的登录控件不满意,可以在智能列表里单击转换为模板,这时登录控件就变成由Table组成的布局了,这时

可以随意加如验证码等功能,但要注意登录控件里的原有控件的ID是不能改的,如用户名文本框的ID是UserName,密码

文本框ID是Password,这时你也能改里面的验证控件的设置。

事件LoggingIn(提交信息验证之前触发)LoggedIN(登录成功后触发)LoginError(登录失败时触发)Authenticate(登

录验证时触发,自定义的验证可以在该事件里定义)

2.LoginStatus控件

用户登录成功时显示一个退出的链接。用户还没登录时显示一个登录的链接。退出调用的是

FormsAuthentication.SignOut方法。登录链接会自动定位到登录页(只有在登录页为login.aspx时,否则找不到)

LoginStatus的状态由Request属性的IsAuthenticated属性确定。

3.LoginView控件

可以根据当前用户是否登录在现实不同信息,可以根据当前登录的用户的角色不同来显示不同的视图。其有两个模板

一个是为匿名用户显示信息,一个是为已登录用户显示信息。可以分别选择两种模板来设计。

4.PasswordRecovery控件

给用户找回密码,查询用户名,用户回答对了密码提示问题,密码将自动发到用户的电子邮箱。(必须指定一个可用的

SMTP发邮件服务器,且你的发送邮箱是用的该服务器,如你是QQ的邮箱就必须指定的SMTP发邮件服务器是

smtp.qq.com,还要指定你邮箱的帐号和密码,这些在ASP.NET网站管理工具的"应用程序"里"SMTP设置"里设置完就会

在web.config里自动生成代码,当发送邮件时System.net.mail会调用<system.net>里设置的信息来发送邮件(这里微

软有一个邮件标头中找到无效的字符的bug:http://support.microsoft.com/kb/947323/zh-

cn;http://blog.csdn.net/AiZoey/archive/2009/03/20/4007146.aspx;http://www.zu14.cn/2008/11/18/net_mail

_bug/;还有种说法http://topic.csdn.net/u/20100819/01/53f5d34b-c88c-4605-96b9-fd580e7bdcee.html;作为第三方程序还要开启QQ,163等邮箱的POP3,SMTP,IMAP服务,使自己的程序能够连接到这些邮箱服务器的同时具有收发邮件的功能,可网易等很多邮箱不支持第三方程序(outlook等邮箱客户端除外)包括其他邮箱来连接自己的邮箱服务器达到处理自己邮箱里邮件的目的),一旦发送邮件失败本帐号也会有无法查到的现象)

当使用这个功能时,<membership>节点的passwordFormat必须没有被设置为Hashed,否则将自动生成随机密码发送。

在web.config里定义了SMTP服务器,在<configuration>里:

                     <system.net>

                            <mailSettings>

                              <smtp from="1294****@qq.com">

                          <network host="smtp.qq.com" password="******" userName="1294****" />

                              </smtp>

                            </mailSettings>

                      </system.net>

然后定义邮件的内容与格式:首先在PasswordRecovery里的MailDefinition属性中配置

              <asp:PasswordRecovery ID="PasswordRecovery1" runat="server">

                <MailDefinition BodyFileName="~/Mail.txt" From="1294736370@qq.com" 

                     Priority="High" Subject="你的密码已找到">

                </MailDefinition>

              </asp:PasswordRecovery>

BodyFileName属性指向的是邮件的内容文本(Mail.txt要与该页在同一目录下,届时<%UserName%>将被替换为用户名

<%Password%>将被替换为用户密码):

               <%UserName%>:

                           你好,你的密码是<%Password%>   

事件VerifyingUser(将用户名提交但还没进行查询验证之前触发)UserLookupError(无法找到用户名时触发)

VerifyingAnswer(用户将密码问题答案提交时触发)AnswerLookupError(密码问题答案错误时发生)

SendingMail(给用户发送密码之前触发)SendMailError(发送密码出错时触发)       

5.ChangePassword控件

更改密码的控件,有更改密码视图和更改成功视图,也有一个MailDefinition属性,其设置与PasswordRecovery一样。

6.LoginName控件:显示当前登录的用户名。

 

7.CreateUserWizard控件:提供了一个注册用户的窗体,是一个向导控件,其派生自Wizard控件,默认由获取用户信息

和显示确认信息两步(俩视图)组成,其内置了不允许相同用户名的功能。直接拖动该控件到页面产生的代码:

           <asp:CreateUserWizard ID="CreateUserWizard1" runat="server">

                <WizardSteps>

                   <asp:CreateUserWizardStep runat="server" />

                   <asp:CompleteWizardStep runat="server" />

                </WizardSteps>

           </asp:CreateUserWizard>

打开CreateUserWizard控件的智能任务栏,可以自己添加步骤(默认情况下其根据web.config中的membership配置信

息来创建用户界面,增加步骤后,可在相应的界面内任意添加控件),也可以编辑模板(和Login控件一样,编辑时必须注

意里面控件的ID要和默认的一致)。

CreateUserWizard控件提供了一些事件:

ContinueButtonClik(单击继续按钮时触发)CreateingUser(使用Membership API创建用户之前触发)

CreatedUser(使用Membership API创建用户成功之后触发)

ContinueDestinationPageUrl属性(单击继续按钮时转向的页面)

 

使用Membership类

Membership是登录控件的底层编程接口,Membership提供了很多属性和方法用于管理用户。每一个用户都是

MembershipUser类(该类提供了管理单个用户的属性和方法)。

Membership很多方法都需要一个MembershipUser实例作为参数,很多方法也能返回一个或多个MembershipUser实例。

1.获取用户列表(用Membership.GetAllusers,该方法返回一个MembershipUserCollection集合)得到这个集合后就可

以绑定到任何数据控件了。Membership.GetUser("用户名")返回一个MembershipUser对象。

2.编辑创建和删除用户(编辑用户Membership.UpdateUser("用户对象")可用Membership.GetUser("用户名")得到一

个用户对象,然后给其属性(Email,Comment,IsApproved(是否允许身份验证)等赋值,注意UserName属性不能被设置其

是只读的IsLockedOut属性不能被设置,当一个用户多次尝试登录失败,系统会自动设置该属性,要给该用户解锁可以

用Membership.UnlockUser("用户名")的方法)同样也不能设置其密码属性,要用Membership.GetPassword()和

Membership.ChangePassword()来操作,不能通过GridView自带的编辑删除功能来处理Membership用户。创建用户

Membership.CreateUser())。

3.验证用户(Membership.ValidateUser("用户名","密码"))。

 

 

学完了登录控件,我们来学角色和授权。前面已经提到过了在一个ASP.NET应用程序中不只可以拥有一个根Web.config文件,如果还有其他文件夹,那么在这些文件夹里还可以有子Web.config文件,只是它们的作用域不同,我们就可以在这些子Web.config里设置不同角色对该文件夹的访问权限。如果根Web.config与子Web.config设置的权限不同,那么对该文件夹的访问以子Web.config的设置为基准。

上面提到的角色分为匿名用户和用户(存在数据源里的),类似于Membership,角色管理类是Role(也有Role API),也是通过角色提供者(默认是SqlRoleProvider,还有windows组(ASP.NET网站管理工具不支持windows组角色提供者))来获取Membership所提供的不同的用户是什么角色的,所以也要是在Forms身份验证开启的前提下才行。原理是在ASP.NET网站管理工具中("工具"-"角色")开启角色后将在根Web.config文件下生成角色开启节点<roleManager enabled="true" />,然后创建和配置角色,最后在("工具"-"访问规则")里配置不同角色对不同文件夹的访问权限(鼠标移上去不变小手的规则是在父web.config里定义的),将会在相应文件夹的web.config文件的<system.web>节点下加<authorization>来控制访问:

                    <?xml version="1.0" encoding="utf-8"?>

                      <configuration>

                         <system.web>

                           <authorization>

                             <allow roles="Systemmanager" />

                             <deny users="*" />

                           </authorization>

                         </system.web>

                      </configuration>

表示该文件夹允许角色是Systemmanager的用户访问,拒绝其他所有用户访问(*所有用户,?匿名用户),一旦被拒绝就会跳转到/login.aspx页面。

除对文件夹设置访问权限之外还可以对某些文件设置访问权限,这只能在相应的web.config文件夹里设置而不能在ASP.NET网站管理工具里设置,

对应节点是<lacation>:

                    <?xml version="1.0" encoding="utf-8"?>

                     <configuration>

                        <system.web>

                          <authorization>

                           <allow roles="Systemmanager" />

                           <allow users="234"/>

                           <deny users="*" />

                          </authorization>

                        </system.web>

                       <location path="MMManager.aspx">

                        <system.web>

                          <authorization>

                            <allow users="345"/>

                            </authorization>

                            </system.web>

                            </location>

                      </configuration>

表示MMManager.aspx文件允许用户345访问。补:还可以在编程中利用Roles API提供的方法属性来操作角色。

即便是已经发布的网站也可以通过ASP.NET网站管理工具设置Membership,Role和访问权限,站点的身份验证默认是windows身份验证而不是Forms身份验证。

 

一般一个网站只有一个登录控件(填用户名密码那个),表aspnet_users里的ApplicationId就是指该控件,只要是ApplicationId相同的用户的帐号就不能相同,但也可以有多个登录控件,这样aspnet_users里就有多种不同的ApplicationId了,ApplicationId不同的用户的帐号可以相同。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics