12.2.1 安全连接.htm
来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 514 行 · 第 1/5 页
HTM
514 行
alt=3星级 src="12.2.1 安全连接.files/Star3.gif"
border=0></DIV></TD></TR></TBODY></TABLE></TD>
<TD class=tr></TD></TR></TBODY></TABLE>
<DIV id=printBody>
<TABLE id=middle
style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; TEXT-ALIGN: left"
cellSpacing=0 cellPadding=0 align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm vAlign=top><BR>
<DIV align=center>
<H1 class=aTitle>Windows2000 服务器端应用程序开发设计指南-安全连接(2)</H1></DIV>
<TABLE width="97%" align=center>
<TBODY>
<TR>
<TD width=502>
<DIV align=center>[日期:2006-11-3 来源:<A
href="http://www.acejoy.com/" target=_blank>ACE开发者</A><SPAN
id=SourceLabel></SPAN> 作者:Jeffrey Richter
Jason D. Clark<SPAN id=AuthorLabel>]</SPAN></DIV></TD>
<TD align=right width=209>
<DIV align=center>[字体: <INPUT title=把正文字体缩小 style="HEIGHT: 16px" onclick="fontSize('m','ArticleBody')" type=button value=小>
<INPUT title=把正文字体扩大 style="HEIGHT: 16px" onclick="fontSize('b','ArticleBody')" type=button value=大>
<INPUT title=转为简体中文模式 style="HEIGHT: 16px" onclick="bodytojt('ArticleBody')" type=button value=简>
<INPUT title=转为繁体中文模式 style="HEIGHT: 16px" onclick="bodytoft('ArticleBody')" type=button value=繁>
<A href="javascript:fontColor('ArticleBody')"><IMG alt=字体颜色
src="12.2.1 安全连接.files/fgcolor.gif" align=absMiddle
border=0></A>]</DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=5 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=top>
<TABLE cellSpacing=0 cellPadding=10 align=left border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<DIV class=content id=ArticleBody
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
<P class=content></P>
<DIV style="WIDTH: 650px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>lTargetDataRep参数指出当通讯跨越网路时,您要使用什么位元组排列方案?您可以选择SECURITY_NATIVE_DREP及SECURITY_NETWORK_DREP。假如您可以选择的话,应该一直使用SECURITY_NETWORK_DREP,以提升作业系统的沟通能力。pInput参数指出传递给InitializeSecurityContext的输入资讯。使用这些参数时,可以传递Blobs及其他资讯给这个函数。在您初始呼叫InitializeSecurity
Context的时候,通常会传递NULL给您的输入缓冲器,因为您没有Blobs可以开始。这个处理程序与pOutput参数相似,它会传回将被传送到服务器软件的Blobs。我们会马上讨论更多输入及输出缓冲器的细节。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您应该传递指向CtxtHandle变数的指标给phNewContext参数。系统经由这个参数传回环境的handle给您。这个Ctxthandle与您经由连续呼叫函数中的phContext栏位所传递到InitializeSecurityContext的相同。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>plContextAttr参数传回经由安全性提供者加于您的工作阶段属性,这将是您在lContextReq参数中要求的属性组合及提供者所加入的属性。您应该一直检查传进此参数的值,以保证您的工作阶段拥有软件的重要属性。ptsExpiration参数将会传回一个时戳,指出您正在建立的环境所代表之工作阶段的到期时间。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7
size=3><B
style="LINE-HEIGHT: 25px">后续对InitializeSecurityContext的呼叫<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>截至目前为止,我们已经讨论了您的客户端第一次呼叫InitializeSecurityContext函数的情形。对此函数的后续呼叫,可以让您在程序中注意到某些差别:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">phContext参数必须事先指向持有phNewContext参数所传回的环境handle变数。<BR
style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">SSPI在后续呼叫InitializeSecurityContext的时候,会忽略pszTargetName参数。<BR
style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">您会经由pInput参数将从服务器接收的Blobs传递到InitializeSecurityContext中。<BR
style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">经由plContextAttr参数传回服务器的环境需求,以及为了错误而结合您的客户端需求应该被检查。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您应该以函数的传回值做基础,做后续对InitializeSecurityContext的呼叫。假如它传回SEC_I_CONTINUE_NEEDED,表示您的客户端应该重覆执行并再次呼叫InitializeSecurityContext。当函数传回SEC_E_OK时,表示您已拥有一个完整的环境。其他的传回值则指出错误的情形。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e74d7
size=3><B style="LINE-HEIGHT: 25px">输入及输出缓冲器<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>直到我们确定了输入及输出缓冲器的主题后,才算完成对InitializeSecurityContext的讨论部份。SSPI函数中可找到输入及输出缓冲器,它会出现在作为pInput及pOutput参数时。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在需要时,输入及输出缓冲器提供一个让软件把资讯传给安全性支援提供者的方法,以足够弹性的方式符合任何支援通讯协定的需求。这就是为什么它们会被多数从系统传送或接收资料之SSPI函数使用的原因。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>让我来为您说明使用这些缓冲器的方法。首先建立一个您所定义之SecBuffer变数的阵列,并且把它们指向您分配的内存缓冲器;然后把阵列的位址加入SecBufferDesc类型的实体中,它会指出您的阵列中有多少缓冲器。以下是SecBufferDesc结构的定义:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">typedef struct _SecBufferDesc { <BR> ULONG ulVersion; // 设定成SECBUFFER_VERSION <BR> ULONG cBuffers; <BR> PSecBuffer pBuffers; <BR>} SecBufferDesc;</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>以下是SecBuffer结构的定义:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">typedef struct _SecBuffer { <BR> ULONG cbBuffer; <BR> ULONG BufferType; <BR> PVOID pvBuffer; <BR>} SecBuffer;</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>SecBuffer的cbBuffer成员指出由pvBuffer成员指向的内存区块大小。SecBufferDesc的ulVersion成员应该一直被设定成SECBUFFER_VERSION。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>对于输出缓冲器,您可以将cbBuffer设定为0,将pvBuffer设定为NULL,系统则会分配缓冲器给您,作为传回资料用。当您用完这个传回的缓冲器时,应把它们传递到FreeContextBuffer中并释放它们。您可以使用传递ISC_REQ_ALLOCATE_MEMORY环境需求给InitializeSecurityContext函数的方式要求系统分配缓冲器给您。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>图12-5的说明显示了SecBuffer与SecBufferDesc之间的关系,以及您的实际内存区块与InitializeSecurityContext的内容。</FONT></P>
<CENTER style="LINE-HEIGHT: 25px">
<P><INPUT id=4 style="LINE-HEIGHT: 25px" type=image height=499
width=550 src="12.2.1 安全连接.files/12-5.gif" border=0
onclick="imgclick"> </P></CENTER>
<CENTER style="LINE-HEIGHT: 25px">
<TABLE border=0>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?