【问题标题】:Good C# XMPP Library supporting Group Chat and TLS or SSL Encryption [closed]支持群聊和 TLS 或 SSL 加密的良好 C# XMPP 库 [关闭]
【发布时间】:2011-09-12 14:51:49
【问题描述】:

所以我一直在努力寻找一个体面的 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 的用户列表中。虽然他们将所有类都记录在一个文件中,但该库很少或根本没有提供关于每个类/方法的实际作用以及应该如何使用它的 cmets。再一次,论坛主要告诉人们查看示例代码,这在很大程度上没有帮助,就像肥皂盒一样,这个库似乎没有得到很好的支持(看起来就像一个开发人员回答了一个问题)。

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

我也遇到了IP*Works Internet Toolkit,但那个库似乎有点成本过高。

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

【问题讨论】:

  • MatriX 可以很好地解决这个问题,我对 OpenFire 也是如此。您可以发布打开 XmppClient 连接的代码部分吗?
  • @jlew 我刚刚在我的问题中包含了显示连接的代码。

标签: c# ssl xmpp survey


【解决方案1】:

大多数 XmppClient 都是异步工作的。当您调用类似 client.Open() 的方法时,它会立即返回,但您需要等待它引发 OnBind() 事件,然后才能对 mucManager 执行任何操作。例如:

    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");
        }      
    }

【讨论】:

  • 那么当“OnBind”事件触发时创建聊天室是“安全”创建聊天室的唯一方法吗?
  • 基本上复制了您创建聊天室的方式并获得了相同的结果。是否还有其他可能导致我做错事的“陷阱”。
  • 您使用的是什么 XMPP 服务器?查看来回发送的消息(OnSendXml/OnReceiveXml)通常很有指导意义,看看是否有任何事情发生或失败。
  • +1 有助于找出我的 Matrix 实现有什么问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2010-11-19
    • 2010-09-05
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多