用户模式初始化
分布式(客户端/服务器)应用程序使用 安全包 获取经过身份验证的连接和交换消息。 应用程序调用安全支持提供程序接口(SSPI)函数,这些函数映射到由 SSP/AP 实现的函数,以及由用户模式 SSP/AP 实现的函数。 此映射由安全提供程序 DLL(Secur32.dll 或 Security.dll)执行,该 DLL 可以动态加载到客户端和服务器进程中。 还可以使用 Secur32.lib 静态链接 DLL。 DLL 和 LIB 均随 Microsoft Windows 软件开发工具包(SDK)一起提供。
如果将包含安全包的 SSP/AP DLL 正确注册,则系统会处理将安全包加载到客户端或服务器的进程中。
服务器开始通过监视端口(等待客户端发送消息)来获取与客户端的安全连接的过程。 客户端通过调用 SSPI 函数 InitializeSecurityContext(常规)开始获取与服务器的安全连接的过程。 此函数映射到自定义安全包的 SpInitLsaModeContext 函数。 SpInitLsaModeContext 将令牌返回到客户端,该令牌将转发到服务器。
从客户端接收令牌后,服务器将调用 SSPI 函数 AcceptSecurityContext (常规),该函数将调度到安全包的 SpAcceptLsaModeContext 函数。 如果 SpAcceptLsaModeContext 函数成功,并且无需再处理安全上下文,该函数应将STATUS_SUCCESS返回到调用方。 如果需要其他处理,该函数应返回SEC_I_CONTINUE_NEEDED,并将令牌返回到服务器。 服务器将令牌转发给客户端,该客户端再次调用 InitializeSecurityContext (常规)。
在建立经过身份验证的连接或失败之前,此调用周期可能会尽可能频繁地重复。 在此过程中,如果 SpAcceptLsaModeContext 或 SpInitLsaModeContext 函数成功,并且无需执行更多处理才能建立 安全上下文,则函数应将STATUS_SUCCESS返回到调用方。 如果需要其他处理,该函数应返回SEC_I_CONTINUE_NEEDED,并向负责转发它的调用方返回令牌。
安全包实现的协议确定此周期重复的次数。 例如,在支持三回合相互身份验证的安全包中,调用顺序如下所示:
- 客户端通过调用 InitializeSecurityContext (常规)来获取令牌,并将其发送到服务器。 服务器首次调用 AcceptSecurityContext (常规),并获取它发送到客户端的回复令牌。
- 客户端在第二次调用中使用从服务器收到的令牌来 InitializeSecurityContext (常规),并获取最终令牌。 客户端将此令牌发送到服务器。
- 服务器接收第 2 回合生成的令牌,该令牌在最终调用中用于 AcceptSecurityContext (常规)。
当 SpAcceptLsaModeContext 和 SpInitLsaModeContext 函数成功并且无需再处理才能建立安全上下文时,函数应将STATUS_SUCCESS返回到调用方。 此外,如果自定义安全包支持用户模式 SSP/APS 实现的函数,SpAcceptLsaModeContext 和 SpInitLsaModeContext 必须通过 MappedContext 参数 返回 TRUE。 MappedContext 值不会传回应用程序;它被 LSA 截获。
当 MappedContexttrue时,LSA 将调用 SSP/AP DLL 的 SpUsermodeInitialize 函数。 此函数提供指向每个安全包实现的用户模式函数的指针表。 使用 SpUsermodeInitialize返回的函数表调用每个包的 SpInstanceInit 函数。 SpInstanceInit 接收指向用户模式 SSP/AP 调用的LSA 函数的指针表。