1、扩展NETMEMBERSHIP权限功能扩展ASP.NET MEMBERSHIP权限功能(一 ) 扩展ASP.NET MEMBERSHIP权限功能目前常用的ASP.NET 的membership功能,可以将权限控制到页,需要我们在web.config中进行设置,如果需求稍多一点,你会发现有些力不从心,网上有很多开源的权限管理系统,但差不多都是重新设计开发,所以我这里要做的是在membership的基础上增加 用户组权限到每个页面及按钮的功能,如A组只能新增,他的页面上面就只有新增按钮,B组只能删除和修改 他的界面上就没有新增的功能,即使B组知道新增的URL,进入后也会提示无权限,各个功能都能过后
2、台数据库进行配置,全局来控制。 membership的用法不用多说,下面讲讲思路1. 当用户访问文件目录,读取当前目录下面的web.config2. 根据web.config中的设定每个文件权限,并匹配数据库中的信息,如果符合条件显示按钮或页面,不成立隐藏或提示1.数据库创建表aspnet_Ex_PermissionsForRoles创建视图vw_aspnet_Ex_PermissionsForRoles 创建存储过程aspnet_Ex_GetPermissionByRoles代码 CREATEPROCEDUREdbo.aspnet_Ex_GetPermissionByRolesrolesnv
3、archar(max)=NULL,pathnvarchar(max)=NULLASBEGINSETNOCOUNTON;declaresqlnvarchar(2000)setsql=select*fromvw_aspnet_Ex_PermissionsForRoleswhereRoleNamein(+roles+)andModulePath=+path+ifrolesisnotnullEXECsp_executesqlsqlEND数据库准备完毕下面是结构项目文件结构扩展ASP.NET MEMBERSHIP权限功能(二 ) 前一篇介绍了需求,和数据库结构与和项目结构这一篇主要介绍一下结构和配置ad
4、min下面的web.config EC.Permissions.Config主要是实现了IConfigurationSectionHandler接口,来完成自定义的配置admin/test下面 web.config account test Default.aspx 列表 2 Default.aspx 编辑 16 Default.aspx 删除 32 Ok.aspx 测试 2 1.串行化 web.config EC.Permissions.Config 类usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSyst
5、em.Text;usingSystem.Configuration;usingSystem.Xml;usingSystem.Xml.Serialization;usingSystem.IO;namespaceEC.PermissionspublicclassConfig:IConfigurationSectionHandler#regionIConfigurationSectionHandlerMemberspublicobjectCreate(objectparent,objectconfigContext,System.Xml.XmlNodesection)/EC.Permissions.
6、PermissionInfostringtypeName=(XmlElement)section).GetAttribute(type);Typetype=Type.GetType(typeName);XmlSerializerxz=newXmlSerializer(type);using(StringReadersr=newStringReader(section.OuterXml)returnxz.Deserialize(sr);#endregion2.EC.Permissions.PermissionInfo类usingSystem;usingSystem.Collections.Gen
7、eric;usingSystem.Linq;usingSystem.Text;usingSystem.Xml.Serialization;namespaceEC.PermissionsSerializableXmlRoot(Permission)publicclassPermissionInfo/权限数据库ID/publicintPermissionIdget;set;/用户组ID/publicstringRoleIdget;set;/用户组名/publicstringRoleNameget;set;/模块路径/XmlElement(ModulePath,typeof(string)publi
8、cstringModulePathget;set;/模块名字/XmlElement(ModuleName,typeof(string)publicstringModuleNameget;set;/权限值/publicPermissionTypePermissionValueget;set;XmlArrayItem(Item,typeof(PermissionItemInfo)publicPermissionItemInfoItemsget;set;SerializableXmlRoot(Items)publicclassPermissionItemInfoXmlElement(Page,typ
9、eof(string)publicstringPageget;set;XmlElement(Function,typeof(string)publicstringFunctionget;set;XmlElement(Val,typeof(int)publicintValueget;set;publicoverrideboolEquals(objectobj)if(obj=null)returnfalse;if(this.GetType()!=obj.GetType()returnfalse;if(PermissionItemInfo)obj).Page=this.Page)returntrue
10、;returnbase.Equals(obj);/权限类型/publicenumPermissionTypeALL=0,LIST=2,VIEW=4,ADD=8,EDIT=16,DELETE=32,PRINT=643.EC.Permissions.DAL 数据库访问usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;usingSystem.Web.Security;usingSystem.Data;usingEC.DBUtility;usingS
11、ystem.Data.SqlClient;usingSystem.Configuration;usingSystem.Web;namespaceEC.PermissionspublicclassDALprivatestaticDataAccessManagerdataAccessManager=newDataAccessManager();/判断页面是否有此权限/1.得到当前用户所有的用户组/2.得到所有用户组的权限并取并集/publicstaticboolCheckPage()boolbResult=false;PermissionInfopi=GetPermissionInfo;if(pi
12、=null)returntrue;Hashtableht=GetPermissionsByRole();if(ht.Count0)stringkey=string.Format(M-0,FolderPath);if(ht.ContainsKey(key)stringfilename=GetFileName;/拆箱取出并判断权限PermissionInfoht_PermissionInfo=(PermissionInfo)htkey;foreach(PermissionItemInfotempinpi.Items)if(temp.Page.ToLower().Equals(filename)&(
13、Convert.ToInt32(ht_PermissionInfo.PermissionValue)&temp.Value)=temp.Value)bResult=true;break;returnbResult;/判断按钮是否有此权限/1.得到当前用户所有的用户组/2.得到所有用户组的权限并取并集/publicstaticboolCheckButton(PermissionTypetype)boolbResult=false;Hashtableht=GetPermissionsByRole();if(ht.Count0)stringkey=string.Format(M-0,FolderPa
14、th);if(ht.ContainsKey(key)/拆箱取出并判断权限PermissionInfoht_PermissionInfo=(PermissionInfo)htkey;bResult=(ht_PermissionInfo.PermissionValue&type)=type;returnbResult;/当前目录/publicstaticStringFolderPathgetstringpaths=HttpContext.Current.Request.ServerVariablesSCRIPT_NAME.ToString();returnpaths.ToLower();/获取当前
15、访问页面地址/publicstaticstringGetFileNamegetstringpaths=HttpContext.Current.Request.ServerVariablesSCRIPT_NAME.ToString();returnpaths.Substring(paths.LastIndexOf(/)+1).ToLower();/获取当前目录下权限配置集合/publicstaticPermissionInfoGetPermissionInfogetreturn(PermissionInfo)ConfigurationManager.GetSection(Permission);
16、/得到所有用户组的权限并取并集/publicstaticHashtableGetPermissionsByRole()Hashtableht=newHashtable();stringrolesArr=Roles.GetRolesForUser();stringroles=string.Join(,rolesArr);roles=+roles+;SqlParameterparms=newSqlParameter2;parms0=newSqlParameter(roles,SqlDbType.NVarChar);parms0.Value=roles;parms1=newSqlParameter(
17、path,SqlDbType.NVarChar);parms1.Value=FolderPath;/读取用户组的所有权限using(IDataReaderdr=dataAccessManager.ReadDatabase.ExecuteSpReader(aspnet_Ex_GetPermissionByRoles,parms)while(dr.Read()PermissionInfopermissioninfo=newPermissionInfo();permissioninfo.PermissionId=Convert.ToInt32(drPermissionId);permissioninfo.RoleId=Convert.ToString(drRoleId);permissioninfo.ModulePath=Convert.ToString(drModulePath
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2