如果我按照此页面上列出的示例“http://xsockets.net/docs/installing-xsocketsnet”并将控制器作为自托管应用程序安装在与托管与XSocket控制器通信的网站的Web服务器不同的服务器上,我该怎么办?确保只有我网站上经过身份验证的用户才能访问XSocket控制器。
我是XSockets架构的新手,这令我感到困惑。在JavaScript中调用这行代码peerBroker = new XSockets.WebSocket("ws://127.0.0.1:4502/CustomBroker");
时,似乎需要将一些登录凭据传递给Controller。我没有找到任何文档概述如何安全地将此信息提供给Controller。作为背景,网站方面正在运行MVC5。
混淆的主要问题是代理与不同的服务器作为将访问代理的mvc5应用程序。我试图确保代理只允许当前登录系统的用户访问代理。
答案 0 :(得分:0)
在服务器之间共享auth票证实际上并不那么难。
确保在两个配置中都有相同的机器密钥。
//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]
当您使用forms-auth登录时,您将获得一个类似
的cookie.ASPXAUTH=DFE811295BABA98CFE94040...
要在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();
}
}
这不是必须的,但正如您所见,您可以传递自定义客户端信息。我这样做是通过使用自定义的原则
public class CustomPrincipal
{
public Guid Id { get; set; }
public string Email { get; set; }
public string[] Roles { get; set; }
}
在这种情况下,您可以使用
从故障单中提取用户信息var userinfo = this.JsonSerializer.DeserializeFromString<CustomPrincipal>(ticket.UserData);
注意:阅读http://xsockets.net/docs/security,您将看到您还可以使用Authorize属性并使用OnAuthorization方法(覆盖)
编辑:为了能够访问xsockets服务器上的cookie,您必须连接到设置cookie的同一源。例如:如果连接到localhost(web),则必须使用ws:// localhost:port才能访问cookie。