考察Membership, Roles, 和Profile - Part 2

 本文英文原版及代码下载:

http://aspnet.4guysfromrolla.com/articles/121405-1.aspx#postadlink


考察Membership, Roles, 和Profile - Part 2


导言:

在Part 1我们已经提到Membership class类包含很多方法可以用来创建、删除、修改、检索、验证用户.由于每个开发者的需求不同,Membership class类被设计为使用provider模式。这就意味着membership framework在实际的执行过程中可以进行用户定制.ASP.NET包含有SqlMembershipProvider和ActiveDirectoryMembershipProvider,如果有必要的话,你可以构建自己的provider.

很多网站需要将用户划分为不同的角色.对于处于某种角色的用户,要指定其可以访问哪些页面、可以看到页面的哪些内容、页面某些区域的内容对用户是可编辑还是只读.使用ASP.NET 2.0的roles service的话,对用户进行角色划分、基于角色的功能和验证都比较简单了.与membership service类似,我们可以创建、删除role,对用户分配或移除角色;哪些用户属于哪个角色.

在本文,我们将考察ASP.NET 2.0的role service.我们最开始将看如何在网站里建立并配置roles service,以及如何基于认证规则来使用roles. 此外,我们看如何编程来处理roles service,以及如何使用LoginView Web控件,根据用户的角色显示信息.

 先前准备

为使你的website支持角色,你的网站首先要有用户帐户,这些帐户要么
由SqlMembershipProvider存储在数据库里;要么存储在其它的数据库里.
而role只是一个概念,将role分给具体的用户.


设置你的Website支持Role

和membership service一样,roles service也是使用provider模式,只是ASP.NET 2.0有3个role providers:

1.SqlRoleProvider(默认的)—将role信息存储在一个SQL Server数据库里.如果你使用SqlMembershipProvider的话,也可以用它来处理roles.具体来说,roles service使用2个表:aspnet_Roles表用来为系统里的每一个role生成一条记录;另一个是aspnet_UsersInRoles表,该表将aspnet_Users表与aspnet_Roles表里的roles联系起来.

2.WindowsTokenRoleProvider—获得Windows用户的族群信息.如果你是由Windows authentication登录的授权用户,那么该provider允许你查看用户所在组的情况

3.AuthorizationStoreRoleProvider—由授权管理策略提供role信息,比如Active Directory.

本文将只对SqlRoleProvider provider进行考察,为了使用该provider,我们必须创建相应的数据库表.就像我们在Part 1探讨的那样,有2种方式:

1.通过ASP.NET SQL Server注册工具(aspnet_regsql.exe)——该工具允许你将必需的数据库表、视图、存储过程拷贝到指定的SQL Server 2000 或 SQL Server 2005数据库.

2.通过ASP.NET Website管理工具——当将认证类型选为"From the internet"时,该工具自动的调用aspnet_regsql.exe工具,在App_Data文件夹里的ASPNETDB.mdf数据库里创建相应的数据表.

假设你已经创建好了必需的数据库表,要激活role service的话,打开ASP.NET Website管理工具,点击“Security”标签,再点击"Enable roles"链接,如下所示:


                                                                                                                   图1

在Web.config文件里添加如下的代码:

<roleManager enabled="true" />


如果你是使用的自己的数据库来存储SqlMembershipProvider 和 SqlRoleProvider providers的数据,你需要在<roleManager>元素里指定
一个provider,像下面这样:

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

    <roleManager enabled="true"
                 defaultProvider="CustomizedRoleProvider">
      <providers>
         <add name="CustomizedRoleProvider"
              type="System.Web.Security.SqlRoleProvider"
              connectionStringName="MyDB" />
      </providers>
    </roleManager>
  </system.web>
</configuration>

其中,<connectionString>设置为myDB,其指定的连接字符串连接的数据库里存储的是与membership 和 role有关的数据库表.(我们也可以在<roleManager> 和 <providers>元素里添加额外的特性,我们将在后面的文章探讨)

管理Roles

role service提供了一个Roles class类,该类包含的方法可用于创建和删除角色,以及从角色里添加或移除用户.当你希望以编程的方式来完成这些事情的时候,这是比较有用的.不过我们通常以手工的形式来进行操作.我们可以用ASP.NET Website管理工具来完成,一旦一个角色被激活后,"Enable roles"链接就会变成这2个链接:"Disable roles"和"Create or Manage roles"。点击后一个链接的话,在接下来的界面里你可以添加新角色或管理、删除现有的角色.

                                                                                   图2


点击Manage链接的话,你将看到某个角色下的一系列用户.类似的,退回到Security标签,选"Manage users"的话,你也可以看到一个用户所属的一系列角色.


基于Role的认证

在ASP.NET 1.x版本里,利用Web.config文件里的<authorization>元素,我们可以对基于URL的认证(URL-based authorization),进行user和role级的限制.具体来说,一个<authorization>元素包含多个<allow> 和 <deny>元素,以指定一个文件夹或URL的认证角色.默认情况下anyone可以访问一个URL,因此如果你要进行限制的话,你应该将<allow> 和 <deny> 元素合理的组合起来.

在2.0版本里,我们可以通过ASP.NET Website管理工具任意的进行设置.(当然,如果你愿意的话,也可以手工在Web.config文件添加<authorization>元素)。在管理工具的Security标签,点"Create access rules"链接. 这样在接下来的界面里你可以将authorization设置为users, user classes(*代表所有的users,?代表匿名users)或者roles(如果系统里有的话).选一个文件夹应用rules,指定user, user class,或 role,然后选择访问权限(Allow 或 Deny)

                                                                                           图3

处理Roles Class类

通过Role class类可以编程的方式以多种方法访问role service,比如:

.CreateRole(roleName):向系统添加新的角色

.DeleteRole(roleName):从系统删除角色

.AddUserToRole(userName, roleName):向特定角色添加特定的用户

.IsUserInRole(roleName) / IsUserInRole(userName, roleName):返回true 或 false.判断当前用户是否是某个特定角色的一员.

.GetAllRoles():返回有关系统所有的角色的字符串数组

.GetRolesForUser() / GetRolesForUser(userName):返回一个字符串数组,要么是当前用户所属的所有角色,要么是某个指定用户所属的所有角色.

这些方法可以用来在页面展示系统里所有的角色,或某个用户所属的所有角色,或判断某个用户是否属于某个角色.本文结尾部分的示例有2个页面来演示如何使用Roles lass类:一个是UserList.aspx页面,它列出了系统的所有用户以及用户所属的角色。另一个是RoleList.aspx页面, 它列出了系统所有的角色以及每个角色所属的用户.

在LoginView控件里使用基于角色的代码

在前面我们总览了ASP.NET 2.0里的security Web控件.其中一个是LoginView控件,它有2个模板:AnonymousTemplate和LoggedInTemplate.
当一个匿名用户登录页面时,该控件将显示AnonymousTemplate模板里的内容;如果是注册用户登录的话,将显示LoggedInTemplate模板里的内容.

LoginView控件也可以包含基于角色的模板,比如向控件添加一个 <RoleGroups>元素,再在里面放一个<asp:RoleGroup Roles="comma-delimited list of roles">模板,如下:

<asp:LoginView ID="LoginView1" runat="server">
     <AnonymousTemplate>
         OMG, you are, like so not logged in!
     </AnonymousTemplate>
    
     <RoleGroups>
         <asp:RoleGroup Roles="Developer">
             <ContentTemplate>
                 Welcome back! You are a Developer, I can
                 tell by your svelte figure and impeccable
                 social skills!
             </ContentTemplate>
         </asp:RoleGroup>
         <asp:RoleGroup Roles="Administrator">
             <ContentTemplate>
                 We all bow down to our system adminstrators!
             </ContentTemplate>
         </asp:RoleGroup>
     </RoleGroups>
    
     <LoggedInTemplate>
         You are logged in!! But, wait, you are not
         a member of any roles.
     </LoggedInTemplate>
</asp:LoginView>

当访问者登录页面时,如果有对应其角色的模板,就显示该模板里的内容.

如果你以Developer角色登录的话,你就会看到Developer模板的内容,而不是LoggedInTemplate模板的内容.类似的,如果你属于Developer 和 Administrator角色, 你将会看到看到模板列表里第一个吻合的模板(就本例而言,为Developer)


结语:

就像我们在本文看到的那样,ASP.NET 2.0支持roles和membership services 。它们都使用provider model模式。都包含很多方法来执行相应的任务.都可以通过ASP.NET Website管理工具进行配置.

激活了roles功能后,我们一个通过编程或使用Website管理工具手工的创建角色或向角色赋值.ASP.NET允许基于角色的验证规则.所以你可以对各种文件和文件夹设置访问权限.最后,LoginView控件提供了基于角色的模板,那意味着可以根据角色的不同显示不同的内容.

祝编程快乐! 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值