跨网络的HttpListener和IntegratedWindowsAuthentication

时间:2016-08-22 22:57:25

标签: windows-authentication httplistener

我使用HttpListener创建了一个ClickOnce服务。我需要验证用户的连接:

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://*:80/ClickOnce/");
listener.AuthenticationSChemes = AuthenticationSchemes.IntegratedWindowsAuthentication;
while (true)
{
    var context = listener.GetContext();
    var id = context.User.Identity as WindowsIdentity;
    if (id != null)
    {
        using (var impersonated = id.Impersonate())
        {
           ...
        }
    }
}

只要服务与Http客户端在同一台机器上,这就可以正常工作。但是如果我尝试从另一台机器连接到该服务,它就会拒绝进行身份验证。

如果我通过Internet Explorer连接,它会提示输入用户名/密码,尝试连接,然后返回提示符。

如果我通过Chrome连接,它只是说"此网页不可用ERR_INVALID_AUTH_CREDENTIALS"。

如果我运行VSTOInstaller.exe,则会出现以下错误:

 System.Deployment.Application.DeploymentDownloadException: Downloading http://.../OutlookAddin.vsto did not succeed.
 System.Net.WebException: The remote server returned an error: (401) Unauthorized.
 System.ComponentModel.Win32Exception: The target principal name is incorrect
    at System.Net.NTAuthentication.GetOutgoingBlob(Byte[] incomingBlob, Boolean throwOnError, SecurityStatus& statusCode)
 ...

如果我配置匿名身份验证,它允许通过请求,但我无法对用户进行身份验证。

HttpListener可以通过网络进行身份验证吗?或者是否有另一种HttpListener可以正确支持这种情况?

1 个答案:

答案 0 :(得分:0)

我担心为时已晚,但根据您的错误说明,它可能是Kerberos身份验证的问题。

更具体地说,它要么缺少SPN记录,要么在请求标头中不匹配。检查Fiddler中实际发送的内容并验证SPN是否与记录匹配。我还怀疑你前缀中的指定端口。如果您在网址中有非标准端口,则会经常发生此错误。