考察Membership, Roles, 和Profile - Part 2

系统 2284 0

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

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"链接,如下所示:

考察Membership, Roles, 和Profile - Part 2
图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"。点击后一个链接的话,在接下来的界面里你可以添加新角色或管理、删除现有的角色.

考察Membership, Roles, 和Profile - Part 2

图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)

考察Membership, Roles, 和Profile - Part 2

图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控件提供了基于角色的模板,那意味着可以根据角色的不同显示不同的内容.

祝编程快乐!

考察Membership, Roles, 和Profile - Part 2


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

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

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

【本文对您有帮助就好】

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

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