AzMan是在Microsoft提供的一套授权管理的组件,底层支持XML/AD/ADAM/SQLServer(Vista Only)的存储方式,对于在Windows平台部署应用系统来说,不失为一种偷懒的替代解决办法(想完全自己开发基于数据库的授权管理者除外) ,但微软的东西只有微软自己最清楚,一些基本概念和封装开发过程中碰到的一些问题和困扰,和大家来分享一下:
Authorization Manager逻辑结构
Authorization Manager的抽象逻辑结构由四类基本对象构成,分别为用户(Member)、角色(Role)、任务(Task)和操作(Operation): 用户 用户可以是一个有效的Windows系统账号、AD/ADAM中定义的账号,也可以是完全由应用系统管理和分配的第三方账号;一个用户可以赋予多个角色权限; 角色 角色是一组任务和操作的抽象集合,每个角色可以包含一到多个的任务和操作,另外,也可以包含其它角色,形成“角色组”式的灵活再组合; 任务 任务是一组操作的抽象集合,每个任务可以包含一到多个的操作,另外,也可以包含其它任务,构成灵活的任务叠加组合; 操作 操作代表系统中的最小功能单位,不可再拆分,也不能再包含其他操作,每个操作都包含一个应用域内唯一的ID标识; Authorization Manager组件模型 应用域 代表了一个授权管理的应用范围,对应用域内的对象进行操作都必须先初始化存储打开应用域再进行操作,应用域是授权管理对象的访问入口; 用户 用户可以是一个有效的Windows系统账号、AD/ADAM中定义的账号,也可以是完全由应用系统管理和分配的第三方账号;一个用户可以赋予多个角色权限; 角色分配对象 角色分配对象是管理用户授权信息的载体,每个角色分配对象都记录着分配到对应角色定义对象的所有用户信息,是用户和角色定义两个实体的“分配关系定义”;可以与角色定义对象同名,也可以不同名; 角色定义对象 逻辑上属于角色定义,实体上是一种特殊的Task实现(IsRoleDefinition属性为true的Task对象特例),作用是组织和管理粒度更小的任务和操作;可以与角色分配对象不同名,但默认是一个与角色分配对象同名的定义。 任务 任务是一组操作的抽象集合,每个任务可以包含一到多个的操作,另外,也可以包含其它任务,构成灵活的任务叠加组合; 操作 操作代表系统中的最小功能单位,不可再拆分,也不能再包含其他操作,每个操作都包含一个应用域内唯一的ID标识; 在逻辑图中,角色是一种东西,在组件模型中,角色却是两种东西,如果简单地用OpenRole或CreateRole方法操作角色,可能就是会和AzMan 管理控制台MMC上完全不一样的操作结果了,大家要注意,已走过的弯路。 贴两个方法就说明白了: public static bool AddRole(IAzApplication application,string roleName, string roleDesc) { bool result=false; IAzTask task=null; try { task = application.CreateTask(roleName, null);//搞笑,定义角色却必须创建Task task.IsRoleDefinition = 1;//再打这个标记 task.Description=roleDesc; task.Submit(0, null);//一个MMC中的角色定义生成了 AddRoleAssign(application,roleName,roleDesc); result=true; } catch (Exception e) { LogHelper.LogError(LogName+".AddRole",roleName,e); } return result; } public static bool AddRoleAssign(IAzApplication application,string roleName, string roleDesc) { bool result=false; IAzRole iazRole=null; try { iazRole=application.CreateRole(roleName, null);//这个创建角色其实是角色分配 iazRole.Description=roleDesc; iazRole.AddTask(roleName, null); iazRole.Submit(0,null); result=true; } catch (Exception e) { LogHelper.LogError(LogName+".AddRoleAssign", roleName,e); } return result; } 另外,如果向角色添加一个用户失败,如果不重置 (iazRole.Submit(1,null);可以理解为回滚),会导致后续本应正常提交的用户也失败,这应该算AzMan的一个Bug,因为其他的方法都不需要,大家小心这些坑! public static bool AddUserToRole(IAzApplication application, string user,string roleName) { bool result=false; IAzRole iazRole=null; try { iazRole = application.OpenRole(roleName, null); iazRole.AddMember(user, null); iazRole.Submit(0, null);//提交 result=true; } catch (Exception e) { try { if (iazRole!=null) iazRole.Submit(1,null);//没这个以后调用这个方法全玩完 } catch{} LogHelper.LogError(LogName+".AddUserToRole",teller+"/n"+roleName,e); } return result; } 时间紧张,不多说了,有需要的再交流吧