如何使用 NTLM 对 WCF Web 服务的控制台应用程序进行身份验证?

Jor*_*mer 5 authentication wcf ntlm

我有一个 WCF Web 服务,使用 basicHttpBinding 和托管在 IIS 7 上的 NTLM(禁用匿名身份验证并启用 Windows 身份验证)。AppPool 使用直通身份验证。我有一个远程连接到 Web 服务的控制台应用程序。

如果我使用我的域用户进行连接,则该过程将成功连接。如果我使用在域上创建的新服务帐户进行连接,则会收到以下错误:

HTTP 请求未经客户端身份验证方案“Ntlm”的授权。从服务器收到的身份验证标头是“NTLM”。

内部异常是:

远程服务器返回错误:(401) 未经授权。

这是域帐户的问题还是我的身份验证方案的问题?错误消息暗示它是身份验证方案,但为什么它会在我的帐户下工作,而不是在同一域上创建的服务帐户?

服务器配置

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
</security>
Run Code Online (Sandbox Code Playgroud)

客户消费

public static WMServiceClient CreateWMServiceProxy()
{
    var proxy = new WMServiceClient();

    proxy.Endpoint.Address = new EndpointAddress( ConfigurationCache.WMServiceEndpoint );
    proxy.Endpoint.Binding = new BasicHttpBinding( BasicHttpSecurityMode.TransportCredentialOnly )
    {
        MaxBufferSize = 2147483647,
        MaxReceivedMessageSize = 2147483647
    };

    ( (BasicHttpBinding) proxy.Endpoint.Binding ).Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

    return proxy;
}
Run Code Online (Sandbox Code Playgroud)

Jor*_*mer 1

解决方案:这实际上并不像我最初想象的那样是 WCF 错误。当我记录内部异常时,我发现收到“401 - 未经授权”错误。结果我创建的服务帐户没有获得对服务主机的远程连接访问权限。一旦我们授予访问权限并将服务帐户添加为用户,该进程就可以正确连接。