控制ISAPI扩展标识
进程和ISAPI应用程序线程标识在IIS应用程序标识表中声明。此表中忽略一个细节,ISAPI扩展GetExtensionVersion函数在本地系统安全上下文中调用,而其它ISAPI函数调用使用与请求关联的安全令牌。
若ISAPI扩展访问安全资源,如IIS元数据库,它需要通过登录用户安全上下文从进程获取模拟令牌给线程。在ISAPI扩展中获取模拟令牌1. 调用ServerSupportFunction函数并指定HSE_REQ_GET_IMPERSONATION_TOKEN作为值给dwHSERequest参数。这个功能返回一个句柄给模拟令牌,它在EXTENSION_CONTROL_BLOCK结构存活期内有效。异步和同步扩展在处理获取安全令牌上略有不同。若同步操作调用ServerSupportFunction,那么EXTENSION_CONTROL_BLOCK有效直到HttpExtensionProc函数完成。若异步操作调用ServerSupportFunction,那么EXTENSION_CONTROL_BLOCK有效直到扩展调用ServerSupportFunction并指定HSE_REQ_DONE_WITH_SESSION的值给dwHSERequest参数。2. 在当前I/O线程调用ImpersonateLoggedOnUser函数或为指定线程调用SetThreadToken函数,使线程获得用户授权。这两个函数可通过第一步骤中调用ServerSupportFunction函数获取请求句柄给模拟令牌。
3. 若要返回线程到进程的安全上下文中并运行,调用Win32 API RevertToSelf函数返回到原始线程标记。
关于异步操作更多相关信息,请参阅 异步 I/O 处理。
授权
ISAPI扩展的安全性由Microsoft Windows安全模型派生而来。成功发送任何请求前,IIS将再次验证请求资源ACL的已通过用户授权的模拟令牌。此外,对于ASP 的ISAPI扩展请求,工作进程应用用户授权的令牌作为模拟令牌给线程调用进入ISAPI扩展。当ISAPI扩展处理请求时,模拟令牌(替代进程标识)应于所需操作。当选择应用程序隔离模型时(或当选择应用程序缓冲池标识为IIS 6.0方案下工作进程隔离模式),为你程序选择申请了一个最低权限设置。若进程标识和LocalSystem一样,具有最高权限,应用程序给予权限超过用户授权范围,并带来安全风险。
ISAPI故障疑难解答
一些ISAPI过滤器和扩展在一定条件下可能产生故障。
当排除故障失败时,注意下列几点:
o 为调试ISAPI过滤器或池中扩展,你必须附加到DLLHost.dll实例加载它。
o 若你的ISAPI过滤器或扩展调用任何形式的RevertToSelf,你的线程将作为WAM用户(IWAM_machinename)在应用程序缓冲池中运行。WAM用户没有LocalSystem帐户的大部分功能;因此,特权调用依赖于LocalSystem帐户,恢复后将发生故障。
o 若ISAPI过滤器或扩展使用线程池并从HttpExtensionProc或DllMain中创建辅助线程,由此产生的辅助工作线程将无法调整令牌与他们关联。因此,如调用API,如RevertToSelf,ImpersonateLoggedOnUser,和SetThreadToken,当从辅助工作线程调用时,将产生故障。你可以在创建辅助工作线程之前,通过调用RevertToSelf直接解决此问题。
若你的ISAPI过滤器或扩展属于上面几点之一,并不能在池中运行,你仍然可以在IIS 5.0隔离模式下将它配置为进程内运行。若要完成此任务,你可以创建进程内应用程序,或你可以添加扩展到元数据库InProcessIsapiApps列表。该列表包含需要运行在进程内完整路径的任何扩展。列表上的所有扩展在进程内运行,不管包含它们应用程序的配置。
创建进程内应用程序
1. 创建新应用程序虚拟目录或服务器。
2. 打开其属性页。
3. 在 主目录,虚拟目录或目录属性页,应用程序设置下,选择 低(IIS进程)。
添加扩展到 InProcessIsapiApps 列表
o 由于列表无用户界面,你必须使用命令行工作,如 Adsutil.vbs 或 Mdutil.exe,添加你的扩展。根键全路径是 HKEY_LOCAL_MACHINE/W3SVC/InProcessIsapiApps。