好的C#XMPP库支持群聊和TLS或SSL加密

时间:2011-06-10 15:42:49

标签: c# ssl xmpp survey

所以我一直在努力寻找一个合适的C#库来与XMPP一起使用,它支持客户端和服务器之间的SSL或TSL加密。我希望有人可以推荐我满足我的一些需求的库,并得到相当好的支持/记录。也许有人可以证实我对我已经尝试过的一些库的怀疑。

我的第一次尝试使用了Soapbox Studio SDK。 Found here from Conversant,但据我所知,他们只支持SASL身份验证。我试图联系他们但没有得到回应,论坛似乎没有工作,因为我无法在他们的论坛上发布我的问题。也许我对使用Soapbox库的SSL假设是错误的,如果有人可以纠正我,那将是很好的,因为那是我更喜欢使用的库。

我接下来转向了Matrix,这是agXmpp的继承者。经过几天拖动他们的留言板并浏览他们的示例应用程序后,我甚至无法在我的openfire服务器上创建群聊。在ag Software formum上发布的几乎所有相关问题都指导人们使用他们的示例应用程序来回答他们的问题。但是,除非我误解了某些内容,否则他们的许多示例应用程序似乎已过时或不适合我的需求。以下代码是我尝试使用其库创建群聊的示例。如果有人使用他们的图书馆,也许他们可以指出我做错了什么。

这些是我的使用指令

using System;
using Matrix.Xmpp.Disco;
using Matrix.Xmpp.Client;
using Matrix.Xmpp.Session;
using Matrix.Xmpp;
using Matrix;

以下是连接到Xmpp客户端的代码

readonly XmppClient _xmppClient = new XmppClient();

public string Connect() {
   try
   {
       _xmppClient.SetUsername(OPENFIRE_USER_NAME);
       _xmppClient.Password = OPENFIRE_PASSWORD;
       _xmppClient.SetXmppDomain(OPENFIRE_SERVER);

       _xmppClient.Show = Matrix.Xmpp.Show.chat;
       _xmppClient.AutoRoster = true;
       _xmppClient.Open();

                return "Connection Succesful";
    }
    catch (Exception ex)
    {
       _logger.LogError("SessionManager", "Connect", "Could not connect to Openfire                     Server", ex.ToString());
                        return "Could not Connect to Openfire Server";
    }
}

这是创建新聊天室的代码

public string CreateRoom(string roomName, string serverName, string userName)
{
    Jid groupJid = new Jid(userName, serverName, "gec2o");

    using (MucManager mucManager = new MucManager(_xmppClient))
    {
        mucManager.EnterRoom(groupJid, roomName, true);
        mucManager.RequestInstantRoom(groupJid);
    }

    return "";
}

但是,服务器上没有创建聊天室,也没有引发异常。另外我知道我可以使用他们的库连接到我的服务器,因为我可以看到我的登录名出现在openfire的用户列表中。虽然他们将所有类都记录在一个文件中,但是库几乎没有提供关于每个类/方法实际做什么以及如何使用它的注释。同样,论坛主要是告诉人们查看示例代码,这些代码基本上没有用,而且像soapbox这个库似乎没有得到很好的支持(看起来像一个开发人员回答单个问题)。

我简要介绍了其他库,例如jabber-net,但在支持和文档方面,它似乎与Soapbox和Matrix相同。

我也遇到IP*Works Internet Toolkit,但该图书馆看起来有些成本过高。

我意识到我在这个问题上做了很多假设,但我现在已经研究了好几天了,这是我能够得出的最好的结论。我希望有人可以纠正我的假设,或者推荐一个没有出现我一直面临的这些问题的图书馆。

2 个答案:

答案 0 :(得分:3)

大多数XmppClient都是异步工作的。当你调用像client.Open()这样的东西时,它会立即返回,但你需要等待它在使用mucManager做任何事情之前引发OnBind()事件。例如:

    public class ChatRoom
    {
        private readonly ILogger _logger;
        private XmppClient _client;
        private MucManager _mucManager;

        public ChatRoom(ILogger logger)
        {
            _logger = logger;           
        }

        public string UserName { get; set; }
        public string Password { get; set; }
        public string XmppDomain { get; set; }
        public System.Uri BoshUri { get; set; }
        public string RoomJid { get; set; }
        public string RoomNick { get; set; }

        public void Start()
        {
            _client = new XmppClient(UserName, XmppDomain, Password);               
            _client.OnBind += (o, e) => _CreateChatRoom(_client, RoomJid, RoomNick);
            _client.OnSendXml += (o, e) => Trace(ConsoleColor.DarkGreen, "Sending:\n {0}", e.Text);
            _client.OnReceiveXml += (o, e) => Trace(ConsoleColor.DarkMagenta, "Receiving:\n {0}", e.Text);
            _client.OnError += (o, e) => Trace(ConsoleColor.Red, "Error: {0}", e.Exception);
            _client.Open();
            _client.Close(); 
        }
        private void Trace(ConsoleColor color, string msg, params object[] args)
        {
            var oldColor = _logger.Color;
            _logger.Color = color;
            _logger.Log(msg, args);
            _logger.Color = oldColor;
            Debug.WriteLine(msg, args);
        }

        private void _CreateChatRoom(XmppClient client, string chatRoomName, string roomNick)
        {
            _mucManager = new MucManager(client);
            _mucManager.EnterRoom(chatRoomName, roomNick);            
        }

        public void SendMessage(string text)
        {
            _client.Send(new Message("muc@conference.dgwbhbm1", MessageType.groupchat, text));
        }

        public void End()
        {
            _client.Close();
        }

        public void Invite(Jid[] user)
        {
            _mucManager.Invite(user, RoomJid, "Come chat");
        }      
    }

答案 1 :(得分:0)

所以看起来这个问题的答案似乎是我的原始首选库(Soapbox Studio SDK)确实支持TLS加密,因此一直是最佳选择。看起来好像TLS没有很好地记录和/或我错过了这个功能。

根据您的服务器配置(我使用的是Openfire Server),您应该能够将服务器配置为仅接受加密连接。而不是使用SSL(Openfire是从其服务器弃用的过程)并尝试通过SSL端口5223进行连接,只需通过默认端口(5222)连接并要求加密连接将强制客户端使用TLS并自动协商握手。此外,可以配置服务器以防止客户端创建其他用户。通过控制哪些客户端能够在您的服务器上创建XMPP用户而不是颁发SSL证书,您基本上可以确保始终保持安全通信。