“Cannot generate SSPI context”(无法生成 SSPI 上下文)

http://support.microsoft.com/kb/811889/zh-cn

本文分步介绍如何排查“Cannot generate SSPI context”错误消息最常见的根源。在下列情形中,您可能会收到此错误消息:

  • 正在与 SQL Server 建立连接。
  • 正在使用集成安全性。
  • 使用 Kerberos 执行安全委派。

了解 Kerberos 术语和服务主体名称

客户端计算机上的 SQL Server 驱动程序利用集成安全性来使用用户帐户的 Windows 安全令牌,以便成功连接到运行 SQL Server 的计算机。Windows 安全令牌从客户端委派到运行 SQL Server 的计算机。当使用下列某一配置将用户的安全令牌从一台计算机委派到另一台计算机时,SQL Server 驱动程序就执行了这一委派:
  • 命名管道上的 NTLM(不使用安全支持提供程序接口 [SSPI])
  • TCP/IP 套接字上的 NTLM(使用 SSPI)
  • TCP/IP 套接字上的 Kerberos(使用 SSPI)
安全支持提供程序接口 (SSPI) 是一组 Windows API,它们允许在任何普通数据传输层(如 TCP/IP 套接字)上进行委派和相互身份验证。因此,SSPI 允许运行 Windows 操作系统的计算机在任何可以传输原始字节数据的传输层上将用户安全令牌从一台计算机安全地委派到另一台计算机。

当 SSPI 使用 Kerberos 在 TCP/IP 上委派,而 Kerberos 不能完成将用户安全令牌成功委派到运行 SQL Server 的目标计算机上所必需的操作时,就会出现“Cannot generate SSPI context”错误。
安全支持提供程序接口为何选择 NTLM 或 Kerberos
Kerberos 使用一种称为服务主体名称 (SPN) 的标识符。您可以将 SPN 视为网络服务器资源中某个实例的唯一域或林标识符。您可以对一个 Web 服务、SQL 服务或 SMTP 服务使用 SPN。还可以使多个 Web 服务实例位于同一台具有唯一 SPN 的物理计算机上。

SQL Server 的 SPN 由下列元素构成:
  • 服务类:它标识一般的服务类。SQL Server 的服务类始终为 MSSQLSvc。
  • 主机:它是运行 SQL Server 的计算机的完全限定域名 DNS。
  • 端口:它是服务正在侦听的端口号。
例如,运行 SQL Server 的计算机的 SPN 通常为:
默认实例的 SPN 格式与命名实例的 SPN 格式不同。端口号用于将 SPN 与特定实例联系起来。

当客户端上的 SQL Server 驱动程序使用集成安全性连接到 SQL Server 时,客户端上的驱动程序代码会尝试使用 WinSock 网络 API 来解析运行 SQL Server 的计算机的完全限定 DNS。为了执行这一操作,该驱动程序代码会调用 gethostbynamegethostbyaddr WinSock API。如果计算机使用的是集成安全性,即使 IP 地址或主机名是作为运行 SQL Server 的计算机的名称传递的,SQL Server 驱动程序也仍然尝试解析计算机的完全限定 DNS。

当客户端上的 SQL Server 驱动程序解析运行 SQL Server 的计算机的完全限定 DNS 时,会使用相应的 DNS 创建该计算机的 SPN。因此,凡是与通过 WinSock 将 IP 地址或主机名解析为完全限定 DNS 的过程有关的问题,都有可能导致 SQL Server 驱动程序为运行 SQL Server 的计算机创建无效的 SPN。

例如,客户端 SQL Server 驱动程序可创建为已解析完全限定的 DNS 的无效 SPN 包括:
  • MSSQLSvc/SQLSERVER1:1433
  • MSSQLSvc/123.123.123.123:1433
  • MSSQLSvc/SQLSERVER1.antartica.corp.mycompany.com:1433
  • MSSQLSvc/SQLSERVER1.dns.northamerica.corp.mycompany.com:1433
当 SQL Server 驱动程序创建了无效 SPN 时,由于 SSPI 接口会尝试在 Active Directory 目录服务中查找该 SPN,因此身份验证仍然有效,但找不到该 SPN。如果 SSPI 接口找不到该 SPN,Kerberos 身份验证就不会执行。此时,SSPI 层就切换到 NTLM 身份验证模式,同时登录过程使用 NTLM 身份验证并且通常会成功。如果 SQL Server 驱动程序创建了有效的 SPN 但未分配相应的容器,则当它尝试使用却无法使用该 SPN 时,就会出现“Cannot generate SSPI context”错误消息。如果 SQL Server 启动帐户是一个本地系统帐户,相应的容器就是计算机名称。对于任何其他帐户,相应的容器是 SQL Server 启动帐户。由于身份验证将尝试使用它所找到的第一个 SPN,因此在为容器分配 SPN 时一定不要出差错。换句话说,一个 SPN 必须且只能分配给一个容器。

Kerberos 身份验证成功的关键因素是网络上的 DNS 功能有效。您可以使用 Ping 命令行实用工具来验证客户端和服务器上的这一功能。在客户端计算机上,运行以下命令来获取运行 SQL Server 的服务器的 IP 地址(其中,运行 SQL Server 的计算机的名称是 SQLServer1):
ping sqlserver1
要弄清楚 Ping 命令行实用工具是否解析了 SQLServer1 的完全限定 DNS,请运行以下命令:
ping -a IPAddress
例如:
 
  
 
  
命令 ping -a IPAddress 解析为运行 SQ
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您所需的代码可能需要更多的信息和细节,但是我可以给您提供一个大概的思路: 1. 首先,您需要定义一个函数,该函数可以接收标签并返回相应的上下文。您可以使用预训练的语言模型(如GPT-2)来生成上下文,然后根据标签使用模型的输出来选择相关的上下文。 2. 其次,您需要定义如何处理标签。标签可以是单个词汇或多个词汇的组合。您需要将标签转换为与模型输入相匹配的格式。例如,您可以将标签转换为一个向量,然后将其与模型输入拼接起来。 3. 最后,您需要调用您定义的函数,将标签传递给它,并将返回的上下文用于您的代码。 以下是一个可能的示例代码,供您参考: ```python import torch from transformers import GPT2Tokenizer, GPT2Model # 加载预训练的GPT-2模型和分词器 tokenizer = GPT2Tokenizer.from_pretrained('gpt2') model = GPT2Model.from_pretrained('gpt2') # 定义一个函数,它可以接收标签并返回相应的上下文 def get_context(label): # 将标签转换为模型输入的格式 input_ids = tokenizer.encode(label, add_special_tokens=False, return_tensors='pt') # 生成上下文 output = model.generate(input_ids=input_ids, max_length=100, do_sample=True) # 将输出转换为文本 context = tokenizer.decode(output[0], skip_special_tokens=True) # 返回上下文 return context # 测试函数 label = "python" context = get_context(label) print(context) ``` 这个示例代码使用了预训练的GPT-2模型和分词器。它定义了一个名为get_context的函数,该函数接收一个标签,并返回相应的上下文。它使用了generate方法生成上下文,并使用了decode方法将输出转换为文本。您可以根据您的需求和数据的特点来修改和调整此代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值