0

如果我按照此页面“ http://xsockets.net/docs/installing-xsocketsnet ”中概述的示例,并将控制器作为自托管应用程序安装在与托管网站的 Web 服务器不同的服务器上,该网站将与 XSocket 通信控制器,我如何确保只有来自我网站的经过身份验证的用户才能访问 XSocket 控制器。

我是 XSockets 架构的新手,这让我很困惑。peerBroker = new XSockets.WebSocket("ws://127.0.0.1:4502/CustomBroker");当在 JavaScript中调用这行代码时,似乎我需要将一些登录凭据传递给控制器​​。我还没有找到任何说明如何将这些信息安全地提供给控制器的文档。作为后台,网站端运行的是MVC5。

主要的混淆点是代理与将访问代理的 mvc5 应用程序位于不同的服务器上。我试图确保代理只允许当前登录系统的用户访问代理。

4

1 回答 1

0

在服务器之间共享身份验证票实际上并不难。

  1. 请确保您在两个配置中具有相同的机器密钥。

    //Machine key in web
    <machineKey compatibilityMode="Framework45" validationKey="validation-key-here" decryptionKey="decryption-key-here" validation="SHA1" decryption="AES" />
    
    //Machine key in app-server
    <machineKey compatibilityMode="Framework45" validationKey="same-as-on-webserver" decryptionKey="same-as-on-webserver" validation="SHA1" decryption="AES" />
    
    //Do note that compabilityMode will be different between 4.5 and other .NET versions see [MSDN][1]
    
  2. 当您使用 forms-auth 登录时,您将获得一个类似的 cookie

    .ASPXAUTH=DFE811295BABA98CFE94040...
    
  3. 要在 XSockets.NET 中获取该 cookie,只需这样做

    public class MyController : XSocketController
    {
        public MyController()
        {            
            this.OnOpen += MyController_OnClientConnect;
        }
    
        void MyController_OnClientConnect(object sender, XSockets.Core.Common.Socket.Event.Arguments.OnClientConnectArgs e)
        {
            var ticket = GetFormsAuthenticationTicket();
            //Validate ticket & maybe extract user info as shown below...
            //If not valid just call this.Close();
        }
    }
    
  4. 这不是必需的,但正如您所见,您可以传递自定义客户信息。我通过使用自定义原则来做到这一点

    public class CustomPrincipal
    {
        public Guid Id { get; set; }
        public string Email { get; set; }
        public string[] Roles { get; set; }
    }
    
  5. 在这种情况下,您可以从票证中提取用户信息

    var userinfo = this.JsonSerializer.DeserializeFromString<CustomPrincipal>(ticket.UserData);
    

注意:阅读http://xsockets.net/docs/security,您将看到您还可以使用 Authorize 属性并使用 OnAuthorization 方法(覆盖)

编辑:为了能够访问 xsockets 服务器上的 cookie,您必须连接到与设置 cookie 相同的源。例如:如果您连接到 localhost (web),则必须使用 ws://localhost:port 才能访问 cookie。

于 2014-05-31T06:29:51.817 回答