的SignalR安全性:它如何工作?

我只想知道的是:

>所有请求中都存在的“连接令牌”正在哪里创建?通过谁 ?是否可以自定义它?
>如何仅在“连接”方法上应用AuthorizeAttribute?

看,我只希望用户第一次发送凭据,然后获得一个令牌(自定义设置会很棒)并使用此令牌进行通信.

我精确地说,我使用一个简单的集线器,并且没有持久连接.

解决方法:

据我所知,连接令牌只是一个ID和用户名. ID是随机生成的.在SignalR的早期版本中,可以通过实现IConnectionIdFactory接口(但为that hasn’t been possible since 2013)来对其进行自定义.

现在,要回答“它是如何生成的”问题,让我们深入研究SignalR的源代码.我正在使用ILSpy搜索源代码.可以免费在线获取.您可以看到我的ILSpy窗口here.

有趣的代码在Microsoft.AspNet.SignalR.Infrastructure.ConnectionManager中:

public IPersistentConnectionContext GetConnection(Type type)
{
    if (type == null)
    {
        throw new ArgumentNullException("type");
    }
    string fullName = type.FullName;
    string persistentConnectionName = PrefixHelper.GetPersistentConnectionName(fullName);
    IConnection connectionCore = this.GetConnectionCore(persistentConnectionName);
    return new PersistentConnectionContext(connectionCore, new GroupManager(connectionCore, PrefixHelper.GetPersistentConnectionGroupName(fullName)));
}

这导致我们:

internal Connection GetConnectionCore(string connectionName)
{
    IList<string> signals = (connectionName == null) ? ListHelper<string>.Empty : new string[]
    {
        connectionName
    };
    string connectionId = Guid.NewGuid().ToString();
    return new Connection(this._resolver.Resolve<IMessageBus>(), this._resolver.Resolve<IJsonSerializer>(), connectionName, connectionId, signals, ListHelper<string>.Empty, this._resolver.Resolve<ITraceManager>(), this._resolver.Resolve<IAckHandler>(), this._resolver.Resolve<IPerformanceCounterManager>(), this._resolver.Resolve<IProtectedData>());
}

所以你在那里.连接ID只是一个随机的Guid,令牌是ID加用户名.

上一篇:CodeGo.net>如何在ASP.NET Core中保持对象活动?


下一篇:四、Signalr手持令牌验证