角色管理可以帮助您管理授权,允许您指定应用程序中的用户可以访问的资源。角色管理允许您向角色分配用户(如 manager、sales、member 等),从而将用户组视为一个单元。在 Windows 中,可通过将用户分配到组(如 Administrators、Power Users 等)来创建角色。
建立角色后,可以在应用程序中创建访问规则。例如,站点中可能包括一组只希望对成员显示的页面。同样,您可能希望根据当前用户是否是经理而显示或隐藏页面的一部分。使用角色,您可以独立于单个应用程序用户建立这些类型的规则。例如,您无需为站点的各个成员授予权限,允许他们访问仅供成员访问的页面;而是可以为 member 角色授予访问权限,然后在人们注册时简单地将用户添加到该角色中或从该角色中删除,或允许用户的成员资格失效。
用户可以具有多个角色。例如,如果站点是个论坛,则有些用户可能同时具有成员角色和版主角色。您可能定义每个角色在站点中拥有不同的特权,同时具有这两种角色的用户将具有两组特权。
即使应用程序只有很少的用户,您仍能发现创建角色的方便之处。角色使您可以灵活地更改特权、添加和删除用户,而无需对整个站点进行更改。为应用程序定义的访问规则越多,使用角色这种方法向用户组应用更改就越方便。
角色和访问规则
建立角色的主要目的是为您提供一种管理用户组访问规则的便捷方法。创建用户,然后将用户分配到角色(在 Windows 中,将用户分配到组)。典型的应用是创建一组要限制为只有某些用户可以访问的页面。通常的做法是将这些受限制的页面单独放在一个文件夹内。然后,可以使用网站管理工具定义允许和拒绝访问受限文件夹的规则。例如,可以配置站点以使成员和经理可以访问受限文件夹中的页面,并拒绝其他所有用户的访问。如果未被授权的用户尝试查看受限制的页面,该用户会看到错误消息或被重定向到您指定的页面。
角色管理、用户标识和成员资格
若要使用角色,必须能够识别应用程序中的用户,以便可以确定用户是否属于特定角色。您可以对应用程序进行配置,以两种方式建立用户标识:Windows 身份验证和 Forms 身份验证。如果应用程序在局域网(即在基于域的 Intranet 应用程序)中运行,则可以使用用户的 Windows 域帐户名来标识用户。在这种情况下,用户的角色是该用户所属的 Windows 组。
在 Internet 应用程序和其他不适合使用 Windows 帐户的方案中,可以使用 Forms 身份验证来建立用户标识。对于此任务,通常是创建一个页面,用户可以在该页面中输入用户名和密码,然后您对用户凭据进行验证。ASP.NET Login 控件可以为您执行其中的大部分工作,也可以创建登录页面并使用 FormsAuthentication 类建立用户标识。
注意 |
---|
角色不处理未在应用程序中建立标识的用户(匿名用户)。 |
如果使用 Login 控件和 Forms 身份验证建立用户标识,则还可以联合使用角色管理和成员资格。在这个方案中,使用成员资格来定义用户和密码。然后,可以使用角色管理定义角色并为这些角色分配成员资格用户 ID。但是,角色管理并不依赖于成员资格。只要您能够在应用程序中设置用户标识,就可以继续使用角色管理进行授权。
角色管理 API
角色管理不仅限于限制对页面或文件夹的权限。角色管理还提供一个 API,可使用该 API 以编程方式确定用户是否属于某角色。这使您能够编写利用角色的代码,并能够不仅基于用户是谁而且基于用户所属的角色来执行所有应用程序任务。
如果在应用程序中建立了用户标识,则可以使用角色管理 API 方法创建角色、向角色中添加用户并获取有关用户在角色中的分配情况的信息。这些方法使您可以创建自己的用于管理角色的接口。
如果应用程序使用 Windows 身份验证,则角色管理 API 为角色管理提供的功能较少。例如,不能使用角色管理创建新角色。不过,可以使用 Windows 用户和组管理创建用户帐户和组,并将用户分配到组。然后,角色管理可以读取 Windows 用户和组信息,以便您可以使用此信息进行身份验证。
ASP.NET 角色管理的工作原理
若要使用角色管理,首先要启用它,并配置能够利用角色的访问规则(可选)。然后可以在运行时使用角色管理功能处理角色。
注意 |
---|
对于配置角色管理、定义角色、向角色中添加用户和创建访问规则而言,最简单的方法是使用网站管理工具。 |
角色管理配置
若要使用 ASP.NET 角色管理,请使用如下所示的设置在应用程序的 Web.config 文件中启用它:
<roleManager enabled="true" cacheRolesInCookie="true" > </roleManager>
角色的典型应用是建立规则,用于允许或拒绝对页面或文件夹的访问。可以在 Web.config 文件的 authorization 元素(ASP.NET 设置架构)部分中设置此类访问规则。下面的示例允许 members 角色的用户查看名为 memberPages 的文件夹中的页面,同时拒绝任何其他用户的访问:
<configuration> <location path="memberPages"> <system.web> <authorization> <allow roles="members" /> <deny users="*" /> </authorization> </system.web> </location> <!-- other configuration settings here --> <configuration>
有关设置访问规则的更多信息,请参见 ASP.NET 授权。
还必须创建 manager 或 member 之类的角色,并将用户 ID 分配给这些角色。如果应用程序使用 Windows 身份验证,则可以使用 Windows 计算机管理工具创建用户和组。
如果使用 Forms 身份验证,则设置用户和角色的最简单的方法是使用 ASP.NET 网站管理工具。如果您愿意,可以通过调用各种角色管理器方法来以编程方式执行此任务。下面的代码示例演示如何创建角色 members:
Roles.CreateRole("members")
Roles.CreateRole("members");
下面的代码示例演示如何将用户 JoeWorden 单独添加到角色 manager 中,以及如何将用户 JillShrader 和 ShaiBassli 一同添加到角色 members 中:
Roles.AddUsersToRole("JoeWorden", "manager") Dim userGroup(2) As String userGroup(0) = "JillShrader" userGroup(1) = "ShaiBassli" Roles.AddUsersToRole(userGroup, "members")
Roles.AddUsersToRole("JoeWorden", "manager"); string[] userGroup = new string[2]; userGroup[0] = "JillShrader"; userGroup[1] = "ShaiBassli"; Roles.AddUsersToRole(userGroup, "members");
在运行时使用角色
在运行时,当用户访问站点时,他们将以 Windows 帐户名建立标识或通过登录应用程序建立标识。(在 Internet 站点中,如果用户未经登录而访问站点,即匿名访问,他们将没有用户标识,因此不属于任何角色。)应用程序可从 User 属性获取有关已登录用户的信息。启用角色后,ASP.NET 将查找当前用户的角色,并将其添加到 User 对象中,以便于您检查。下面的代码示例演示如何确定当前用户是否属于 member 角色,如果是,则显示用于成员的按钮:
If User.IsInRole("members") Then buttonMembersArea.Visible = True End If
if (User.IsInRole("members")) { buttonMembersArea.Visible = True; ;
ASP.NET 还创建 RolePrincipal 类的实例并将其添加到当前请求上下文中,以使您可以以编程方式执行角色管理任务,如确定特定角色中有哪些用户。. 下面的代码示例演示如何获取当前已登录用户的角色列表。
Dim userRoles() as String = CType(User, RolePrincipal).GetRoles()
string[] userRoles = ((RolePrincipal)User).GetRoles();
如果在应用程序中使用 LoginView 控件,该控件将检查用户的角色并能够基于用户角色动态创建用户界面。
缓存角色信息
如果用户的浏览器允许 Cookie,则 ASP.NET 可以选择在用户计算机的加密 Cookie 中存储角色信息。在每个页面请求中,ASP.NET 读取 Cookie 并根据 Cookie 填充该用户的角色信息。此策略可最大程度地减小从数据库中读取角色信息的需要。如果用户的浏览器不支持 Cookie 或者 Cookie 已禁用,则只在每个页面请求期间缓存角色信息。