我使用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可以正确支持这种情况?
答案 0 :(得分:0)
我担心为时已晚,但根据您的错误说明,它可能是Kerberos身份验证的问题。
更具体地说,它要么缺少SPN记录,要么在请求标头中不匹配。检查Fiddler中实际发送的内容并验证SPN是否与记录匹配。我还怀疑你前缀中的指定端口。如果您在网址中有非标准端口,则会经常发生此错误。