套接字身份验证使用NegotiateStream失败

时间:2009-03-19 18:29:14

标签: c# authentication sockets

我有一个连接的Socket,用于获取HTTP标头响应。如果我跳过身份验证,一切正常(除非页面需要身份验证)。但是,当我进入此代码时,它总是在AuthenticateAsClient行上抛出IOException。消息是:“无法从传输连接读取数据:连接已关闭”。我已经尝试过DefaultCredentials和DefaultNetworkCredentials。

关于我缺少什么的任何想法?是什么导致连接关闭?

感谢

if (Authenticate)
{

    NetworkStream clientStream = new NetworkStream(webSocket, false);
    NegotiateStream authStream = new NegotiateStream(clientStream);

    NetworkCredential netcred = CredentialCache.DefaultNetworkCredentials;


    try
    {
        authStream.AuthenticateAsClient(netcred,
            String.Empty,
            ProtectionLevel.None,
            TokenImpersonationLevel.Identification);

        if (!authStream.IsAuthenticated)
        {
            Console.WriteLine("Authentication failed");
            ErrorText = "Authentication using default credentials failed";
            return (HttpStatusCode)(-1);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        ErrorText = ex.Message;
        return (HttpStatusCode)(-1);
    }
}

1 个答案:

答案 0 :(得分:0)

NegotiateStream不执行HTTP身份验证:

  

在Windows 95/98系统上,Windows NT LAN Manager(NTLM)是用于身份验证的协议。在其他平台上,如果客户端和服务器都支持Kerberos协议,则使用Kerberos协议进行身份验证。否则使用NTLM。

查看提供WebClientCredentials属性的ResponseHeaders类。