Winapi 使用SSPI时如何获得权限?

Winapi 使用SSPI时如何获得权限?,winapi,kerberos,sspi,Winapi,Kerberos,Sspi,当您使用安全支持提供程序接口(SSPI)API验证用户的凭据时,服务器最终会有一个句柄 然后,您可以使用函数查询有关安全上下文句柄的信息: QueryContextAttributes(句柄,) tsStart:建立上下文的时间 tsExpiry:上下文将过期的时间 QueryContextAttributes(句柄,) sAuthorityName:验证机构的名称(如果可用) QueryContextAttributes(句柄,) tsPasswordExpires:当安全上下文的

当您使用安全支持提供程序接口(SSPI)API验证用户的凭据时,服务器最终会有一个句柄

然后,您可以使用函数查询有关安全上下文句柄的信息:

  • QueryContextAttributes(句柄,
    • tsStart:建立上下文的时间
    • tsExpiry:上下文将过期的时间
  • QueryContextAttributes(句柄,
    • sAuthorityName:验证机构的名称(如果可用)
  • QueryContextAttributes(句柄,
    • tsPasswordExpires:当安全上下文的凭据过期时
  • QueryContextAttributes(句柄,
    • 名称:安全包的名称
    • 注释:这可以是包传回的任何附加字符串
  • QueryContextAttributes(句柄,
    • sClientName:出站票证中客户端的主体名称
    • sServerName:出站票证中服务器的主体名称
  • QueryContextAttributes(句柄,
    • sTargetName:初始目标的SPN
当我使用SSPI验证我的凭据时,服务器会获得一组关于me的信息,其中一项失败:

  • 上下文句柄:
    0x04CC9F4000AC8B80
  • 用户名:
    STACKOVERFLOW\ian
  • 本机客户端名称
    ian@STACKOVERFLOW.COM
  • 本机服务器名称
    ian@STACKOVERFLOW.COM
  • 用户SID:
    S-1-5-21-1708537768-844245398-2146844275-1109
  • 客户端指定的目标:
    ian
  • 权限:
    请求的功能不受支持(80090302)
  • 密码过期(UTC):
  • 寿命开始:
    2019年10月23日11:03ᴀᴍ
  • 使用期限到期:
    2019年10月23日7:32ᴘᴍ
  • 包名称:
    Kerberos
  • 软件包注释:
    MicrosoftKerberos V1.0
  • 包功能:
    0x028F3BBF
  • 软件包版本:
    0001
  • 包Rpc ID:
    0010
  • 包最大令牌长度:
    48000
证书颁发机构 我想知道验证(或证明缓存的)凭据的机构

除了使用
SECPKG\u ATTR\u AUTHORITY
调用QueryContextAttributes(和QueryContextAttributesEx)失败,错误如下:

// MessageId: SEC_E_UNSUPPORTED_FUNCTION
//
// MessageText:
//
//  The function requested is not supported
//

SEC_E_UNSUPPORTED_FUNCTION       = HRESULT($80090302);
你在干什么

我可以使用命令行找到它:

C:\Users\Ian>SET

LOGONSERVER=\\HYDROGEN
但我使用的是API

背景:SSPI的工作原理 SSPI被设计成围绕不同安全算法的通用包装器。使用API的方法非常简单:

  • 客户端
    • 调用
      InitializeSecurityContext
      ,并得到一个blob
    • 客户端将该blob发送到服务器
  • 服务器
    • 调用AcceptSecurityContext(blob),并返回一个blob
    • 服务器将该blob发送回客户端
  • 客户端
    • 调用
      InitializeSecurityContext(blob)
      ,并返回一个blob
    • 客户端将该blob发送回服务器
  • 服务器
    • 调用AcceptSecurityContext(blob),并返回一个blob
    • …不断重复,直到被告知停止
双方都会不断地来回移动,直到函数停止返回需要发送给另一方的blob:

因此,在SSPI中,你来回地打乒乓球,直到你被告知停止为止。因此,他们能够将每个身份验证方案塞进乒乓球,直到被告知停止高级抽象

你是如何传送这些斑点的? 你可以通过你所使用的任何通信通道来传输这些斑点

如果您正在通过TCP/IP与远程服务器通信,那么您可能会使用:

// Open connection to server
sockConnect(162.210.196.166, 1433);

blob = null;

Boolean bContinue = InitializeSecurityContext(ref blob);

while (bContinue)
{
   sockWrite(blob); //send the blob to the server

   blob = sockRead(); //wait for the server to return a blob 

   bContinue = InitializeSecurityContext(ref blob);
}
如果您是通过http执行此操作:

blob = null;
Boolean bContinue = InitializeSecurityContext(ref blob);

while (bContinue)
{
    http = new HttpRequest("http://4chan.org/default.aspx");
    http.AddHeader("X-SSPI-Blob", blob.ToBase64());
    http.Send();

    blob = http.ReasponseHeader["X-SSPI-Blob"];
    if (blob.IsEmpty())
       break;

    bContinue = InitializeSecurityContext(ref blob);
}
你甚至可以通过信鸽发送它们

额外阅读 SSPI是的Windows实现的名称

通用安全服务应用程序接口(GSS-API)

奖金
  • “我应该将TargetName设置为什么?”

不支持
SECPKG\u ATTR\u AUTHORITY
属性,导致参数无效错误。并导致链接错误。它似乎在
Secur32.lib
中丢失了。因此,您可以显示可复制的演示和步骤吗?我在Windows 10 1903上进行了测试。@RitaHan MSFT如果您使用C/C++;SDK,链接失败是有意义的.lib文件不正确。请确保加载SspiCli.dll和导出的QueryContextAttributesExW(或Ansi等效)函数。但我不会太努力:
QueryContextAttributesEx
也会失败。感谢您指导我找到方法。是的,我复制了此问题。(错误0x80090302)我将就此问题咨询相关工程师,并在此处尽快更新。顺便问一下,您的Windows版本是什么?@RitaHan MSFT
>ver
Microsoft Windows[version 10.0.18362.418]
不支持
SECPKG\u ATTR\u AUTHORITY
属性,导致参数对我无效。请重新安装