我只想知道的是:
>所有请求中都存在的“连接令牌”正在哪里创建?通过谁 ?是否可以自定义它?
>如何仅在“连接”方法上应用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加用户名.