Asp.net MVC 基于规则的权限设计
2012-01-18 11:17
232 查看
上面一篇文章我们简单介绍了一个一级菜单的应用。
在实际的设计中菜单的的信息基本存储在sitemap的xml文件中,菜单还涉及到权限问题。
本章将介绍并举例说明如何设计基于规则的MVC应用程序的安全性。
基于角色的授权
在计算机系统的安全,基于角色的访问控制(RBAC)是一个系统访问限制授权用户的方法。在一个组织内,角色创建的各项工作职能。来执行某些操作的权限分配给特定的角色。
业务上我们必须定义一套针对不同的业务功能的角色体系,例如管理员,数据管理员,普通用户的角色... ...
基于规则的访问控制
以规则为基础的授权框架,一般利用XML文档存储简单的规则设置,来控制系统访问权限。(也可以存储在数据库中,读者可以扩展Enterprise Library)
请参见下面的例子。
规则“IsAdministrator”会检查当前用户是否有Administrator的角色。 “IsUser”将对角色User, DataSteward或者Administrator都有效。
SecurityHelper
SecurityHelper类利用了Enterprise Library 的默认的AuthorizationRuleProvider,它是我们整个系统的权限核心。主要代码如下。
?
其中对当前用户检查某个规则的有效性代码如下。
?
菜单的访问控制
在Web.sitemap文件中我们对每个节点增加一个属性,AuthorizationRule这样菜单和用户角色就关联起来了。
菜单的规则如何、什么时候被加载呢?在渲染菜单的SiteMapBinding.cshtml文件中,我们的代码如下。(示例利用了Telerik for Asp.net MVC控件)
其中item.Visible=SecurityHelper.Authorized(node.Attributes["AuthorizationRule"].ToString());这行代码就决定了菜单的可见性由我们定义的规则控制。
UI元素访问控制
利用同样原理,按钮的enable/disable也可以基于规则来控制。我们首先构造一个类 (HtmlHelper)用于在页面上显示按钮。
View Code
代码很简单,它也利用了我们前面提到的SecurityHelper类的功能。
我们把这个属性设置的示例程序中的CustomerController类中。
假设我们登录的用户没有DataSteward或Administrator角色,但是他尝试直接在浏览器里面输入URL:http://localhost:2967/Customer。
新增的Filter控制了直接URL的权限管理。
按钮显示的控制
----------------------------------------------------------------------
示例代码.
http://files.cnblogs.com/huyq2002/Sample.zip
运行程序您需要生成数据库CustomerMaster,运行CustomerMaster.sql,同时修改NHibernate.config中的connection.connection_string
系统适用于域认证,也很容易扩展到其他认证方式,如form认证等
通过改变代码中的UserService的GetUser方法可以模拟不同的角色来使用系统
分类: 架构设计
在实际的设计中菜单的的信息基本存储在sitemap的xml文件中,菜单还涉及到权限问题。
本章将介绍并举例说明如何设计基于规则的MVC应用程序的安全性。
基于角色的授权
在计算机系统的安全,基于角色的访问控制(RBAC)是一个系统访问限制授权用户的方法。在一个组织内,角色创建的各项工作职能。来执行某些操作的权限分配给特定的角色。
业务上我们必须定义一套针对不同的业务功能的角色体系,例如管理员,数据管理员,普通用户的角色... ...
基于规则的访问控制
以规则为基础的授权框架,一般利用XML文档存储简单的规则设置,来控制系统访问权限。(也可以存储在数据库中,读者可以扩展Enterprise Library)
请参见下面的例子。
<rules> <add expression="R:Administrator" name="IsAdministrator" /> <add expression="R:Administrator OR R:DataSteward" name="IsDataSteward" /> <add expression="R:User OR R:DataSteward OR R:Administrator" name="IsUser" /> </rules>
规则“IsAdministrator”会检查当前用户是否有Administrator的角色。 “IsUser”将对角色User, DataSteward或者Administrator都有效。
SecurityHelper
SecurityHelper类利用了Enterprise Library 的默认的AuthorizationRuleProvider,它是我们整个系统的权限核心。主要代码如下。
?
?
在Web.sitemap文件中我们对每个节点增加一个属性,AuthorizationRule这样菜单和用户角色就关联起来了。
<?xml version="1.0" encoding="utf-8" ?> <siteMap enableLocalization="true"> <siteMapNode title="Menu"> <siteMapNode controller="Home" title="Home" action="Index" resourceKey="Tab_Home" AuthorizationRule="IsUser"/> <siteMapNode controller="Customer" title="Manage Customers" action="Index" resourceKey="Tab_ManageCustomers" AuthorizationRule="IsDataSteward"/> <siteMapNode title="Switching Brands" resourceKey="Tab_SwitchingBrands" AuthorizationRule="IsUser"> <siteMapNode title="Violin" controller="Home" action="SetTheme/Violin" AuthorizationRule="IsUser"/> <siteMapNode title="Mack" controller="Home" action="SetTheme/Mack" AuthorizationRule="IsUser"/> <siteMapNode title="Mack Dual" controller="Home" action="SetTheme/MackDual" AuthorizationRule="IsUser"/> <siteMapNode title="Renault" controller="Home" action="SetTheme/Renault" AuthorizationRule="IsUser"/> <siteMapNode title="Volvo BA" controller="Home" action="SetTheme/VolvoBA" AuthorizationRule="IsUser"/> <siteMapNode title="Volvo Group" controller="Home" action="SetTheme/VolvoGroup" AuthorizationRule="IsUser"/> </siteMapNode> </siteMapNode> </siteMap>
菜单的规则如何、什么时候被加载呢?在渲染菜单的SiteMapBinding.cshtml文件中,我们的代码如下。(示例利用了Telerik for Asp.net MVC控件)
@using Volvo.CustomerMaster.Web.Common.Security @using Volvo.CustomerMaster.Web @{ Html.Telerik().Menu() .Name("Menu") .BindTo("Web",(item, node) =>{ if (node.Attributes["resourceKey"] !=null) item.Text = UI_Resources.ResourceManager.GetString(node.Attributes["resourceKey"] as string) ?? item.Text; if(node.Attributes["imageurl"] != null) item.ImageUrl = node.Attributes["imageurl"].ToString(); item.Visible = SecurityHelper.Authorized(node.Attributes["AuthorizationRule"].ToString()); }) .Effects(fx => fx.Toggle() .OpenDuration(200) .CloseDuration(200)) .Render(); }
其中item.Visible=SecurityHelper.Authorized(node.Attributes["AuthorizationRule"].ToString());这行代码就决定了菜单的可见性由我们定义的规则控制。
UI元素访问控制
利用同样原理,按钮的enable/disable也可以基于规则来控制。我们首先构造一个类 (HtmlHelper)用于在页面上显示按钮。
View Code
代码很简单,它也利用了我们前面提到的SecurityHelper类的功能。
我们把这个属性设置的示例程序中的CustomerController类中。
[HandleError] [RuleAuthorize(Allow="IsDataSteward")] public class CustomerController : BaseController { public ICustomerService CustomerService { get; set; } public CustomerController(ICustomerService customerService) { CustomerService = customerService; }
假设我们登录的用户没有DataSteward或Administrator角色,但是他尝试直接在浏览器里面输入URL:http://localhost:2967/Customer。
新增的Filter控制了直接URL的权限管理。
按钮显示的控制
----------------------------------------------------------------------
示例代码.
http://files.cnblogs.com/huyq2002/Sample.zip
运行程序您需要生成数据库CustomerMaster,运行CustomerMaster.sql,同时修改NHibernate.config中的connection.connection_string
系统适用于域认证,也很容易扩展到其他认证方式,如form认证等
通过改变代码中的UserService的GetUser方法可以模拟不同的角色来使用系统
// 2. Get roles defined for the user if (userName.Equals("v0cn174", StringComparison.CurrentCultureIgnoreCase)) { //user.AddRole(new UserRole(UserRoleConstants.Administrator)); user.AddRole(new UserRole(UserRoleConstants.DataSteward)); //user.AddRole(new UserRole(UserRoleConstants.User)); } else { // All users are superusers in this mock //user.AddRole(new UserRole(UserRoleConstants.Administrator)); //user.AddRole(new UserRole(UserRoleConstants.DataSteward)); user.AddRole(new UserRole(UserRoleConstants.User)); } return user;
分类: 架构设计
相关文章推荐
- Asp.net MVC 基于规则的权限设计(续)-- 扩展微软企业库安全模块
- Asp.net MVC 基于规则的权限设计(续)-- 扩展微软企业库安全模块
- Asp.net MVC 基于规则的权限设计
- ASP.net MVC 基于角色的权限控制系统的实现
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
- Asp.net MVC权限设计思考 (一)数据库建库部分
- 基于ASP.NET MVC的JQueryUI控件开发(3) - Accordion控件设计
- Asp.net MVC权限设计思考 (三)后台UI设计
- 一个基于Asp.Net MVC的权限方案
- 一个基于Asp.Net MVC的权限方案
- asp.net MVC 权限设计
- [备用]权限设计方案、如何使用session、MVC如何使用模板、DropdownList、怎么添加Bootstrape框架、使用ASP.NET MVC 4 Bootstrap Layout Template(VS2012)
- Asp.net MVC权限设计思考 (三)后台UI设计
- asp.net MVC 2 自定义用户角色权限设计
- ASP.NET MVC 中如何实现基于角色的权限控制
- 基于ASP.NET MVC URL 权限控制
- 在ASP.NET MVC中实现基于URL的权限控制
- asp.net MVC 权限设计
- ASP.NET MVC +EasyUI 权限设计(二)环境搭建
- ASP.net MVC 基于角色的权限控制系统的实现