1. AzMan的存储
通过在命令行输入azman.msc即可以打开Azman的控制管理台,利用该管理台我们可以新建和打开AzMan的存储。
常用的存储格式有两种,一种是采用Xml格式存储,另外一种是存储到AD中,后者具有较高的安全性和执行效率。
注意:
当你采用AD存储时,则要求AD域控制器具有windows server 2003域功能级别。如果你采用的是命令行dcpromo来升级到域控制器的话,这时的域控制器并不具有windows server 2003域功能级别,它默认的级别是windows server 2000的域功能级别,你需要到“Active Directory 用户和计算机”控制管理台中来升级,具体的方法如下:
选择根节点,点击“查看”菜单中的“提升域功能级别”的命令,即可以将域控制器升级到windows server 2003级别了。
当你安装了windows 2003的sp1之后,就可以调用到azman.msc命令行了。
2. AzMan授权存储的部署
可以采用vbscript脚本来实现AzMan授权存储的部署,采用这种方式,可以将授权存储部署成Xml文件格式或者部署到AD域控制器中。你需要在脚本代码中创建出所有的操作、任务和角色,并将它们进行对应的组合,当然你也可以创建用户组等。其不足之处在于在引用AD的用户或者用户组时,需要的是他们类似Guid标识,示例代码如下:
'--- 初始化管理员对象
Dim pAzManStore
Set pAzManStore = CreateObject("AzRoles.AzAuthorizationStore")
'--- 为NAMIS应用程序创建基于XML 的新存储区
pAzManStore.Initialize 1+2, "msxml://D:"NAMISApp"NAMIS"App_Data"JetAzStore.xml"
'--- 为NAMIS应用程序创建基于AD 的新存储区
'pAzManStore.Initialize 1+2, "msldap://CN=MyWebAppsAzStore,CN=Program Data,DC=azroles,DC=com"
pAzManStore.Submit
Dim AppNamis
Set AppNamis = pAzManStore.CreateApplication("NAMIS")
AppNamis.Submit
'--- 创建操作-----------------------
'-------------------------教师管理操作-------------------------------------
Dim o_TeacherAdd
Set o_TeacherAdd=AppNamis.CreateOperation("教师信息添加")
o_TeacherAdd.OperationID = CLng(101001)
o_TeacherAdd.Submit
Dim o_TeacherDelete
Set o_TeacherDelete=AppNamis.CreateOperation("教师信息删除")
o_TeacherDelete.OperationID = CLng(101002)
o_TeacherDelete.Submit
Dim o_TeacherEdit
Set o_TeacherEdit=AppNamis.CreateOperation("教师信息修改")
o_TeacherEdit.OperationID = CLng(101003)
o_TeacherEdit.Submit
Dim o_TeacherQuery
Set o_TeacherQuery = AppNamis.CreateOperation("教师信息查询")
o_TeacherQuery.OperationID = CLng(101004)
o_TeacherQuery.Submit
Dim o_TeacherView
Set o_TeacherView = AppNamis.CreateOperation("教师信息浏览")
o_TeacherView.OperationID = CLng(101005)
o_TeacherView.Submit
Dim o_TeacherBasicInfoView
Set o_TeacherBasicInfoView = AppNamis.CreateOperation("教师基本信息浏览")
o_TeacherBasicInfoView.OperationID = CLng(101006)
o_TeacherBasicInfoView.Submit
'---------------------教师操作结束-------------------------------------------
'--------------------------------创建系统用户--------------------------------
Set t_sysUser = AppNamis.CreateTask("系统用户")
t_sysUser.IsRoleDefinition = TRUE
t_sysUser.Submit
'--- 创建角色定义------------------------------
'--------------------------教师管理角色定义---------------------------------
Set t_sysAdmin = AppNamis.CreateTask("系统管理员")
t_sysAdmin.AddOperation CStr("教师信息添加")
t_sysAdmin.AddOperation CStr("教师信息删除")
t_sysAdmin.AddOperation CStr("教师信息修改")
t_sysAdmin.AddOperation CStr("教师信息查询")
t_sysAdmin.AddOperation CStr("教师信息浏览")
t_sysAdmin.AddOperation CStr("教师基本信息浏览")
t_sysAdmin.IsRoleDefinition = TRUE
t_sysAdmin.Submit
Set t_depAdmin = AppNamis.CreateTask("部门管理员")
t_depAdmin.AddOperation CStr("教师信息添加")
t_depAdmin.AddOperation CStr("教师信息删除")
t_depAdmin.AddOperation CStr("教师信息修改")
t_depAdmin.AddOperation CStr("教师信息查询")
t_depAdmin.AddOperation CStr("教师信息浏览")
t_depAdmin.AddOperation CStr("教师基本信息浏览")
t_depAdmin.IsRoleDefinition = TRUE
t_depAdmin.Submit
Set t_depTeacher = AppNamis.CreateTask("部门教师")
t_depTeacher.AddOperation CStr("教师信息查询")
t_depTeacher.AddOperation CStr("教师信息浏览")
t_depTeacher.AddOperation CStr("教师基本信息浏览")
t_depTeacher.IsRoleDefinition = TRUE
t_depTeacher.Submit
Set t_TeacherInfoView = AppNamis.CreateTask("教师信息查看者")
t_TeacherInfoView.AddOperation CStr("教师信息查询")
t_TeacherInfoView.AddOperation CStr("教师信息浏览")
t_TeacherInfoView.AddOperation CStr("教师基本信息浏览")
t_TeacherInfoView.IsRoleDefinition = TRUE
t_TeacherInfoView.Submit
Set t_TeacherBasicInfoView = AppNamis.CreateTask("教师基本信息查看者")
t_TeacherBasicInfoView.AddOperation CStr("教师信息查询")
t_TeacherBasicInfoView.AddOperation CStr("教师基本信息浏览")
t_TeacherBasicInfoView.IsRoleDefinition = TRUE
t_TeacherBasicInfoView.Submit
'--- 创建初始范围和角色------------------------------
'--- 在此应用程序中只有一个范围(也可以选择不使用范围)
'----------------------分配角色--------------------------------
Set r_sysUser = AppNamis.CreateRole("系统用户")
r_sysUser.AddTask("系统用户")
r_sysUser.AddMember("S-1-5-21-713424229-1904119754-3816579508-1164")
r_sysUser.AddMember("S-1-5-21-713424229-1904119754-3816579508-1165")
r_sysUser.AddMember("S-1-5-21-713424229-1904119754-3816579508-1166")
r_sysUser.AddMember("S-1-5-21-713424229-1904119754-3816579508-1167")
r_sysUser.AddMember("S-1-5-21-713424229-1904119754-3816579508-1168")
r_sysUser.AddMember("S-1-5-21-713424229-1904119754-3816579508-1169")
r_sysUser.AddMember("S-1-5-21-713424229-1904119754-3816579508-1170")
r_sysUser.Submit
Set r_sysAdmin = AppNamis.CreateRole("系统管理员")
r_sysAdmin.AddTask("系统管理员")
r_sysAdmin.Submit
Set r_depAdmin = AppNamis.CreateRole("部门管理员")
r_depAdmin.AddTask("部门管理员")
r_depAdmin.Submit
Set r_depTeacher = AppNamis.CreateRole("部门教师")
r_depTeacher.AddTask("部门教师")
r_depTeacher.Submit
Set r_TeacherInfoView = AppNamis.CreateRole("教师信息查看者")
r_TeacherInfoView.AddTask("教师信息查看者")
r_TeacherInfoView.Submit
Set TeacherBasicInfoView = AppNamis.CreateRole("教师基本信息查看者")
TeacherBasicInfoView.AddTask("教师基本信息查看者")
TeacherBasicInfoView.Submit
执行该脚本后生成的xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<AzAdminManager MajorVersion="1" MinorVersion="0">
<AzApplication Guid="aed7bd60-ab6d-4fde-9a24-3b9cf4fde449" Name="NAMIS">
<AzOperation Guid="04cf78ba-7307-4e4b-85ef-c615324a41ce" Name="教师信息添加">
<OperationID>101001</OperationID>
</AzOperation>
<AzOperation Guid="b6b6d133-d381-4717-b7ed-aea15b9ada29" Name="教师信息删除">
<OperationID>101002</OperationID>
</AzOperation>
<AzOperation Guid="834b9da2-ec87-4ed9-afa5-0f66c9861458" Name="教师信息修改">
<OperationID>101003</OperationID>
</AzOperation>
<AzOperation Guid="2dd33f34-7f7a-452d-b205-3934660f2baa" Name="教师信息查询">
<OperationID>101004</OperationID>
</AzOperation>
<AzOperation Guid="15343038-7cf2-435b-b35d-fc1396d5b477" Name="教师信息浏览">
<OperationID>101005</OperationID>
</AzOperation>
<AzOperation Guid="da9b3cc2-13e2-4c01-9efb-41295e566071" Name="教师基本信息浏览">
<OperationID>101006</OperationID>
</AzOperation>
<AzTask Guid="380e9bbc-dedb-4c71-a37e-1bef9c79934c" Name="系统用户" RoleDefinition="True"/>
<AzTask Guid="7583fe1b-f207-4807-b8a4-c6105251b746" Name="系统管理员" RoleDefinition="True">
<OperationLink>04cf78ba-7307-4e4b-85ef-c615324a41ce</OperationLink>
<OperationLink>15343038-7cf2-435b-b35d-fc1396d5b477</OperationLink>
<OperationLink>2dd33f34-7f7a-452d-b205-3934660f2baa</OperationLink>
<OperationLink>834b9da2-ec87-4ed9-afa5-0f66c9861458</OperationLink>
<OperationLink>b6b6d133-d381-4717-b7ed-aea15b9ada29</OperationLink>
<OperationLink>da9b3cc2-13e2-4c01-9efb-41295e566071</OperationLink>
</AzTask>
<AzTask Guid="fce8b5a6-4eac-4105-96ab-0bd76f26ecd5" Name="部门管理员" RoleDefinition="True">
<OperationLink>04cf78ba-7307-4e4b-85ef-c615324a41ce</OperationLink>
<OperationLink>15343038-7cf2-435b-b35d-fc1396d5b477</OperationLink>
<OperationLink>2dd33f34-7f7a-452d-b205-3934660f2baa</OperationLink>
<OperationLink>834b9da2-ec87-4ed9-afa5-0f66c9861458</OperationLink>
<OperationLink>b6b6d133-d381-4717-b7ed-aea15b9ada29</OperationLink>
<OperationLink>da9b3cc2-13e2-4c01-9efb-41295e566071</OperationLink>
</AzTask>
<AzTask Guid="44ac7773-3b72-431f-aade-9581160d857b" Name="部门教师" RoleDefinition="True">
<OperationLink>15343038-7cf2-435b-b35d-fc1396d5b477</OperationLink>
<OperationLink>2dd33f34-7f7a-452d-b205-3934660f2baa</OperationLink>
<OperationLink>da9b3cc2-13e2-4c01-9efb-41295e566071</OperationLink>
</AzTask>
<AzTask Guid="6a04f0fe-f504-4834-a787-b797ed0d5810" Name="教师信息查看者" RoleDefinition="True">
<OperationLink>15343038-7cf2-435b-b35d-fc1396d5b477</OperationLink>
<OperationLink>2dd33f34-7f7a-452d-b205-3934660f2baa</OperationLink>
<OperationLink>da9b3cc2-13e2-4c01-9efb-41295e566071</OperationLink>
</AzTask>
<AzTask Guid="56ecf095-765d-47c6-aba0-ae7fa064fb4b" Name="教师基本信息查看者" RoleDefinition="True">
<OperationLink>2dd33f34-7f7a-452d-b205-3934660f2baa</OperationLink>
<OperationLink>da9b3cc2-13e2-4c01-9efb-41295e566071</OperationLink>
</AzTask>
<AzRole Guid="6ce372ff-4856-4d1e-8751-e34819781735" Name="系统用户">
<Member>S-1-5-21-713424229-1904119754-3816579508-1164</Member>
<Member>S-1-5-21-713424229-1904119754-3816579508-1165</Member>
<Member>S-1-5-21-713424229-1904119754-3816579508-1166</Member>
<Member>S-1-5-21-713424229-1904119754-3816579508-1167</Member>
<Member>S-1-5-21-713424229-1904119754-3816579508-1168</Member>
<Member>S-1-5-21-713424229-1904119754-3816579508-1169</Member>
<Member>S-1-5-21-713424229-1904119754-3816579508-1170</Member>
<TaskLink>380e9bbc-dedb-4c71-a37e-1bef9c79934c</TaskLink>
</AzRole>
<AzRole Guid="7d32f18c-a532-4c9d-9a98-732f8aac8268" Name="系统管理员">
<TaskLink>7583fe1b-f207-4807-b8a4-c6105251b746</TaskLink>
<Member>S-1-5-21-713424229-1904119754-3816579508-1141</Member>
</AzRole>
<AzRole Guid="a25eac45-cf5a-45fe-b702-6b97f8f7e0b3" Name="部门管理员">
<TaskLink>fce8b5a6-4eac-4105-96ab-0bd76f26ecd5</TaskLink>
<Member>S-1-5-21-713424229-1904119754-3816579508-1152</Member>
</AzRole>
<AzRole Guid="880608c5-b517-41be-a2e8-24773d92fbdf" Name="部门教师">
<TaskLink>44ac7773-3b72-431f-aade-9581160d857b</TaskLink>
</AzRole>
<AzRole Guid="5ef8b936-c7dd-4d4f-bb31-c9d2b05e0673" Name="教师信息查看者">
<TaskLink>6a04f0fe-f504-4834-a787-b797ed0d5810</TaskLink>
</AzRole>
<AzRole Guid="1e70f609-6300-443f-954b-fe0ccce9a38f" Name="教师基本信息查看者">
<TaskLink>56ecf095-765d-47c6-aba0-ae7fa064fb4b</TaskLink>
<Member>S-1-5-21-713424229-1904119754-3816579508-1153</Member>
</AzRole>
</AzApplication>
</AzAdminManager>
其中我们可以更改存储位置为AD服务器,将上述配置直接保存到AD服务器。
3. 站点Web.Config文件的配置
如果你利用了AzMan来实现用户的授权管理,那你通常也会采用AD来实现用户的身份认证,这时候你只需要修改一下配置文件即可以切换到这些功能上。
3.1. 用户认证
修改默认的membership的provider为类型是ActiveDirectoryMembershipProvider 的Provider,如下:
<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
<providers>
<clear/>
<add name="AspNetActiveDirectoryMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADService" enableSearchMethods="true"/>
</providers>
</membership>
3.2. 角色(授权)管理
修改roleManager的provider为类型为AuthorizationStoreRoleProvider 的Provider即可,如下:
<roleManager enabled="true" cacheRolesInCookie="true" defaultProvider="RoleManagerAzManADAMProvider" cookieName=".ASPXROLES" cookiePath="/" cookieTimeout="30" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="false" cookieProtection="All">
<providers>
<clear/>
<add name="RoleManagerAzManADAMProvider" type="System.Web.Security.AuthorizationStoreRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, publicKeyToken=b03f5f7f11d50a3a" connectionStringName="AzManPolicyStoreConnectionString" applicationName="NAMIS"/>
</providers>
</roleManager>
3.3. 配置认证和授权的链接字符串
<connectionStrings>
<clear/>
<add name="ADService" connectionString="LDAP://geshaofei.mcs.local"/>
<add name="AzManPolicyStoreConnectionString" connectionString="msldap://CN=AZMan,DC=mcs,DC=local"/>
</connectionStrings>
或者可采用xml的配置:
<add name="AzManPolicyStoreConnectionString" connectionString="msxml://D:"NAMISApp"NAMIS"App_Data"JetAzStore.xml"/>
但是在使用AD存储的AZMan的配置信息数据库时,如果没有配置站点的应用程序池,可能会抛出以下异常:
Exception Details: System.Runtime.InteropServices.COMException: 访问权不够,不能执行该操作。 (Exception from HRESULT: 0x80072098)。
解决这种问题的办法是需要配置站点的应用程序池,可以为该站点专门创建一个应用程序池,并指定在专用的具有较高权限帐户下运行:
选择应用程序池—〉属性—〉标识—〉选择应用程序池的安全标识设置为配置的专用帐户,如系统管理员或者专用创建的AD访问用户。
还有一个可能的原因就是IIS的匿名访问用户,默认的是Iuse_MachineName,可能需要添加该用户对AzMan的访问权限,或者修改成对AzMan具有访问权限的用户。
4. 授权管理器的使用
4.1. 多个授权存储的管理
利用该控制台我们可以打开多个授权管理的存储,包括XML格式和AD存储格式,他们互不影响。
4.2. 授权管理器模式
右键单击授权管理器根节点,选择“选项….”,会弹出一个对话框,其中有两种模式,开发人员模式和管理员模式,前者比后者具有更多的功能,例如我们可以定义操作,等,而后者通常是在生产环境下使用,为系统管理员提供了一定的管理权限。
在实际的开发过程中,需要设置为开发人员模式。
如果设置为开发模式,但是却不能进行编辑、新建操作,这时候通常是XML文件被VSS设定为只读的模式,需要去掉只读的属性。
4.3. 应用程序组
感觉称之为“授权存储用户组”更为合适一些,因为它其实是对用户组的管理,我们可以在授权存储的根目录下创建应用程序组,也可以在“应用程序”目录下。我们可以创建两种类型的应用程序组“基本”和“LDAP查询”两种类型,
4.3.1. 基本类型
可以定义成员和非成员两个部分,例如我们可以利用这个特点定义出除某个人或者某个组之外的所有用户组。
4.3.2. LDAP查询
我们可以在其中输入LDAP查询语句,在实际使用该用户组的时候,会执行查询来动态的得到用户。例如,我们可以利用这种方式很方便的定义所有职位为“manager”的成员组,如:(title=Manager)。
4.4. 创建操作
操作是最基本的原子单位,我们可以定义一组操作,但这组操作是和我们程序中的具体的动作绑定到一起的,在创建每个操作的时候,需要指定一个操作号码,我们在程序中利用该号码来实现和任务、角色及最终的执行权限关联到一起,即我们可以根据这个操作号码,利用AzMan的编程接口判断出某个用户是否有执行该操作的权限。但在实际的命名和定义号码时,最后能够有一个规范,因为需要在开发过程中使用这些号码。
4.5. 创建任务
任务是把一组操作组合到一起,当然也可以包含有其他的子任务,其实相当于一个权限集。
4.6. 创建角色
角色包含有其他较小的角色、各种任务、甚至是操作。
4.7. 角色分配
虽然创建了各种角色,但是这些角色并没有和实际的用户关联在一起,为了使他们关联在一起,需要分配角色,一旦分配了角色之后,我们可以在分配的角色上来分配具体的用户组。可以是从AD中选择用户或者组,也可以是我们在上面所提到的应用程序组。
5. 代码中使用AzMan
我们可以在程序通过AzMan的类型功能来实现各种更细粒度的控制。
5.1. 引入Com interop程序集
通过项目的“添加引用”,选择“com”选项卡,选择“azroles 1.0 Type Library”来实现对“azroles.dll”组件的引用,然后IDE会自动生成一个代理类“Interop.AZROLESLib.dll”,来实现对Com组件功能的调用。
5.2. 引入名称空间
using AZROLESLib;
5.3. 使用授权存储类
如:
public class AZMan
{
static IAzClientContext clientContext;
static IAzApplication azApp;
static string domainName;
static AZMan()
{
AzAuthorizationStoreClass AzManStore = new AzAuthorizationStoreClass();
AzManStore.Initialize(0, ConfigurationManager.ConnectionStrings["AzManPolicyStoreConnectionString"].ConnectionString, null);
azApp = AzManStore.OpenApplication("NAMIS", null);
domainName = ConfigurationManager.AppSettings["DomainName"];
}
public static void InitWithCurUser()
{
clientContext = azApp.InitializeClientContextFromName(HttpContext.Current.User.Identity.Name, domainName, null);
}
public static bool CanExecute(int opNumber)
{
object[] operationIds = new object[] { opNumber };
object[] result = (object[])clientContext.AccessCheck("Auditstring", new object[1], operationIds, null, null, null, null, null);
int accessAllowed = (int)result[0];
return accessAllowed == 0;
}
}
上面的代码实现了当前用户是否有权限执行某一操作的判断。
5.4. AZMan中的角色
5.4.1. 判断用户是否在某一角色中
5.4.1.1. 利用HttpContext.Current.User.IsInRole
bool inRole = HttpContext.Current.User.IsInRole("roleName");
该方法判断当前登录的用户是否在“roleName”角色中。
5.4.1.2. 利用Roles.IsUserInRole
Roles的名称空间为:System.Web.Security。
bool inRole = Roles.IsUserInRole("roleName");
该方法也是判断当前的用户是否在“roleName”角色中。
bool inRole = Roles.IsUserInRole("userName","roleName");
该方法判断指定的用户名为“userName”的用户是否在“roleName”角色中。
5.4.2. Roles中的其他有用的方法
l Roles.FindUsersInRole
获取某个角色中的用户;
l Roles.GetAllRoles
获取应用程序的所有的角色;
l Roles.GetRolesForUser
获取一个用户的所有角色;
l Roles.GetUsersInRole
获取一个角色中的所有用户;
6. 关于AD的使用
6.1. 如何升级window 2003到AD域控制器
可以通过在命令行输入dcpromo命令,然后会弹出AD的安装向导。然后按照安装向导的提示进行操作即可。升级成功以后,注意提升域控制器的级别,通过AD用户和计算机管理界面的查看菜单中,能够找到这一个菜单项。