在 Kerberos 模式下,通过 WebHttpBinding 连接自托管 WCF 服务失败

Posted

技术标签:

【中文标题】在 Kerberos 模式下,通过 WebHttpBinding 连接自托管 WCF 服务失败【英文标题】:Connect a self-hosted WCF-Service via WebHttpBinding fails in Kerberos-Mode 【发布时间】:2014-08-15 06:12:45 【问题描述】:

我有一个可使用WebHttpBinding 访问的自托管 WCF 服务。该服务应该从客户端上的 Internet Explorer 获取一个 kerberos 令牌,然后他应该使用这个令牌模拟以通过其他服务器上的网络共享访问文件服务器。

喜欢这条链:

IE (Client) -> WCF-Service (BI-Server) -> impersonate -> access network share on file server

但是,如果我更改 ClientCredentialType 或使用 Kerberos 设置添加 ServiceAuthenticationBehavior(401 未授权),IE 会显示一个登录对话框。

使用 NTLM,我可以访问 WCF 服务并进行模拟,但访问文件服务器会导致 UnauthorizedAccessException

同一台服务器还有一个带有 Kerberos 的 NetTcpBinding,可以正常工作。

我做错了什么?

Kerberos(所有服务)的委托在 BI 服务器上激活。

ADS-功能级别为 2012 文件服务器是 Windows Server 2003 WCF/IIS-Host 是 Windows Server 2012 R2 客户端是 Windows 8、IE 10

现在是频道的代码:

var listenUrl =  "http://0.0.0.0:8735";

var bind = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly)

         Security = Transport = ClientCredentialType = HttpClientCredentialType.InheritedFromHost,
         TransferMode = TransferMode.StreamedResponse
;

var host = new WebServiceHost(typeof(C_SIS), new Uri(listenUrl));
host.AddServiceEndpoint(typeof(IW_SIS), bind, "").Behaviors.Add(new WebHttpBehavior());

ServiceAuthenticationBehavior sab = null;
sab = host.Description.Behaviors.Find<ServiceAuthenticationBehavior>();
if (sab == null)

         sab = new ServiceAuthenticationBehavior();
         sab.AuthenticationSchemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.Ntlm;
         host.Description.Behaviors.Add(sab);

else

         sab.AuthenticationSchemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.Ntlm;


host.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(UnbekannterRecv);
host.Open();

【问题讨论】:

检查是否在 IE -> 设置 -> 高级 -> 安全中勾选了“启用集成 Windows 身份验证”设置 已启用并适用于其他用例(如 Intranet) 【参考方案1】:

首先,检查您的服务是否使用域用户运行。 然后您必须为此用户设置一个 SPN(服务主体名称)。

setspn -s http\wcfHostMachineName:PORT DOAMIN\User
setspn -s http\wcfHostMachineName.FULLDomain.Quantifier:PORT DOAMIN\User

使用

清除客户端上的所有 Kerberos 令牌
klist -purge

试试看。如果它有效 - >很好。但是,如果不打开您的 ADS-User-Configuration 并从 wcfHost 中删除所有没有端口的 http-SPN,而不是用户! wcfHost 需要单独的 SPN。

【讨论】:

以上是关于在 Kerberos 模式下,通过 WebHttpBinding 连接自托管 WCF 服务失败的主要内容,如果未能解决你的问题,请参考以下文章

离线数仓之Kerberos基本使用及问题记录

在Kerberos环境下Hue与HBase集成

在 keycloak 中跳过 kerberos sso 身份验证

在 Azure 上的 WCF 中通过 SSL 配置 webHTTP 和 NetHTTP 绑定

在没有用户密码的情况下生成 AD Kerberos 票证

在 kerberos 授权下使用 JDBC 连接到 impala 时出错