Survey Admin 示例:实现 Microsoft .NET 基于角色的安全性(转)

适用于
Microsoft ASP.NET
Microsoft .NET
框架
Microsoft Active Directory
或关系数据库(例如 Microsoft SQL Server?

摘要:讨论数据源、初始化和 Microsoft .NET 框架基于角色的安全功能的使用,以及如何在 MSDN Survey Admin 示例中实现它们。

本页内容
简介
定义用户和角色
选择数据源
Survey Admin
数据源
Principal
对象和 Identity 对象
安全性漏洞
更多信息
小结

定义用户和角色
选择实现基于角色的安全性需要讨论如何识别用户(用户名)和用户类型(角色)。

Survey Admin
示例中的用户

实现基于角色的安全性时所要作出的一个重要选择是如何区分用户。该程序作为 Web 应用程序实现,因此有四种选择:WindowsFormsPassport None。该示例使用 Windows 身份验证并且拒绝匿名用户。这些更改应用到新 Web 应用程序的默认 Web.config 文件:

<authentication mode = "Windows" />
<authorization>
  <deny users="?" />
</authorization>




在授权块中,通配符 "?" 用于识别所有匿名用户。 把该通配符包含在 deny 元素中的结果是匿名用户集被拒绝授权。

当以这种方式使用 Windows 身份验证时,使用 HttpContext 对象以 DOMAIN\username 的格式给定用户名:

sUserName = HttpContext.Current.User.Identity.Name

在示例的设计讨论中我们同意有四种用户类型。首先是调查管理员(survey administrator),他能查看和更改应用程序中的所有页面。调查管理员是唯一能添加新用户和删除用户帐户的用户类型。还有调查所有者(survey owner)。该用户类型只能查看和修改他所创建的调查。另一种用户类型是调查分析员(survey analysts),调查所有者能管理调查分析员,调查分析员有查看其调查结果的权限。最后是匿名用户(anonymous),他在该示例中用作冗余的用户类型。

示例通过四种命名角色实现:SurveyAdministratorSurveyOwnerSurveyAnalyst AnonymousUser。一个用户可以拥有前三种角色中任何一种;所有用户都至少拥有 AnonymousUser 角色。

也许还有其他用户类型,例如 UserManager(用户管理器)。用户管理器可以添加新用户和删除用户帐户,但却不能查看任何调查。如果有时间验证该示例,注意您能否添加该功能。

选择数据源
在哪里管理用户角色最好?有几个安全数据源选项用于维护用户/角色关系。选择取决于公司策略、编程经验和维护要求。当您在审查数据源选项时,请选择最适合于用户数量和安全策略的数据源。

XML
数据文件作为数据源

对单用户管理而言,XML 数据文件是小用户集或用于测试目的的合理数据源。理想情况下,如果用户数量超过用户管理器的容忍阀值(用于 XML 中数据输入工作),那么应该设计一个编辑 XML 数据文件的自定义接口。

Active Directory
作为数据源

Active Directory
最有可能成为数据源的最佳选择。用户接口是操作系统的一部分,它已被广泛地测试并可以使用了。许多情况下,已建立了用户和组(角色)关系。有关如何使用 Microsoft Windows Platform SDK Active Directory 中检索用户和角色信息的详情,请参阅 Enumerating Groups 上的Active Directory 帮助主题。

关系数据库作为数据源

用户上下文可能被要求改进数据库中的内容选择。使用关系数据库(例如 Microsoft SQL Server(TM))管理角色和用户是 Active Directory 基于角色的安全数据源的又一最佳选择。

Survey Admin 数据源
MSDN Survey Admin
示例使用关系数据库作为它基于角色的安全组件的数据源。实际上,该示例并专门使用 Microsoft .NET 框架基于角色的安全功能。这些功能仅在示例的用户界面组件上实现,例如控件的可视状态和页面重定向。

Microsoft .NET
框架基于角色的安全组件可用于验证对数据库内容的访问,但这在设计阶段看起来并不实用。例如,如果是对调查所有者的调查集进行查询,那么数据库不会根据角色对结果进行限制。所有用户拥有的调查都会被返回,那将是一个很大的集合。在数据库服务器上筛选由特定所有者创建的调查比在其他任何地方处理结果集都更有意义。当数据库查询结果通过网络发送到客户端时,发送比所需更多的数据常常是不明智的。MSDN Survey Admin 示例中的存储过程使用自定义 Transact-SQL 基于角色的安全检查。

MSDN Survey Admin
示例向它所使用的数据库中添加四个新的表对象;旧数据库中的五个现有对象并不作更改。


此主题相关图片如下:


1. 修订过的 survey 数据库架构

Owners Analysts 表用于组织拥有查看特定调查权限的用户。Owners 表限制的唯一性约束将只允许一个用户成为调查所有者。角色记录在 Users 表的 Type 列。使用 HttpContext 对象的 Web 应用程序中可用的用户上下文对数据库不一定可用。它取决于数据库连接凭据。而唯一标识符,即 AuthenticatedUsers 表中的 Key 列在用户登录时维护。拥有受限访问的存储过程需要该键作为参数。

在该实现中,一个用户只关联一个角色:为特定用户选择角色列表的存储过程包括带有结果集的 AnonymousUser 角色。理想情况下,应用程序应该不需要从数据库中多次检索角色。在 MSDN Survey Admin 示例中,这种情况在加载 Login.aspx 页面时会发生。数据库返回与特定用户相关联的角色的 XML 表示,该表示被转换为字符串数组。该字符串数组保留在 Session 对象中

如果选择使用 XML 输出来设计存储过程,可以在 SqlCommand 对象上使用方法 ExecuteScalar。但是,输出字符串有一个最大长度。长字符串将被截断。这时使用方法 ExecuteXmlReader。还需要几条额外的语句,但使用打开的 XmlReader 对象的 OuterXML 属性可以得到相同的 XML

Principal 对象和 Identity 对象
System.Security.Principal
命名空间中的 Principal Identity 对象是 Microsoft .NET 框架用户管理工具。理解这两个对象是使用基于角色的安全功能的重要部分。Identity 对象是当前线程中的用户。Principal 对象类似于用户组的概念,但是最好仅把它定义为当前线程中用户的安全性上下文。基于角色的安全性就是在这里初始化的。

使用角色列表初始化用户

初始化用户的目标是在添加角色名称的字符串数组时保留用户标识。HttpContext.Current.User 对象是 Survey Admin 示例中被修改的用户。如果查阅源代码,模块 RoleBasedSecurity.vb 包含了初始化 Principal 对象的代码:

' sRoles is a string array of role names.
HttpContext.Current.User = _
    New GenericPrincipal(HttpContext.Current.User.Identity, sRoles)

 

通常,实现 Microsoft .NET 框架基于角色的安全功能的解决方案将在 global.asax 模块的 Application_AuthenticateRequest 事件中初始化用户。Survey Admin 示例从数据库请求一次角色并在会话中保留信息。Principal 对象在不同模块的 Load 事件中初始化。

使用用户检查权限

Principal
对象的 IsInRole 方法用于测试初始化的 Principal 对象。输出是一个布尔值。一旦用户被初始化,检查权限所需的命令如下所示:

cmdNewUser.Visible = User.IsInRole("SurveyAdministrator")

安全性漏洞Microsoft .NET 框架安全专家 Erik Olson 建议,解决方案(例如 Survey Admin)应该使用安全套接字层 (SSL) 来实现。实施 SSL 能够保护基于 cookie 的会话和验证协议不被截获。另一个最佳选择是使用短会话生存期。通过猜测会话 ID,系统容易受到截获,但这并没有很大的危险。

当需要使用命名帐户连接到数据库时,可以把登录凭据从 Web.config 文件中移出来提高应用程序的安全性。如果使用受信任连接,这不是问题。

更多信息
Microsoft .NET
框架基于角色的安全性

有关使用 Forms 身份验证(而不是 Windows 身份验证)的基于角色的安全功能的另一个示例,请参阅 Microsoft Visual Studio .NET 产品文档中的 Duwamish 7.0:Security 部分。

要研究 .NET 框架安全对象,请参阅 .NET 框架开发者指南联机帮助中的 Role-Based Security

MSDN Survey
示例

有关 MSDN Survey 示例(MSDN Survey Admin 示例以它为基础)的更多信息,请参阅 Survey 示例:Web Form Design in ASP.NET

小结
Microsoft .NET
框架基于角色的安全功能为多个用户类型使用的应用程序提供了方便。实现该功能所需的代码很少,对于像 MSDN Survey Admin 示例这样的 Web 应用程序而言,对象检查权限只需要 HttpContext 对象中 Identity 对象的 IsInRole 方法。

MSDN Survey Admin
示例混合使用了 Microsoft .NET 框架和自定义基于角色的安全性。用户界面功能主要使用 Microsoft .NET 框架基于角色的安全功能来检查权限和设置显示状态。在该示例应用程序的数据源中,自定义基于角色的安全性用于限制查询结果。

 

posted @ 2006-04-17 16:18  火火  阅读(...)  评论(...编辑  收藏