我从模板中创建了两个项目。
第一个包含Membership和MVC4。第二个使用MVC5和Asp.Net Identity。
然后我使用相同的代码将signalR添加到两个项目中。
在Membership项目中,我可以在控制器和SignalR连接类(OnConnected方法)中访问HttpContext.User。但在Identity项目中,我只在控制器中具有HttpContext.User的适当值。在OnConnected方法中,HttpContext.User返回null。
两个项目中的signalR代码相同:
1) SynchronizationConnection.cs
public class SynchronizationConnection : PersistentConnection
{
public SynchronizationConnection()
{
}
protected override Task OnReceived(IRequest request, string connectionId, string data)
{
Debugger.Break();
return base.OnReceived(request, connectionId, data);
}
protected override Task OnConnected(IRequest request, string connectionId)
{
Debugger.Break(); //HttpContext.Current.User == null
return base.OnConnected(request, connectionId);
}
protected override Task OnDisconnected(IRequest request, string connectionId)
{
Debugger.Break();
return base.OnDisconnected(request, connectionId);
}
}
2) Startup.cs
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
ConfigureAuth(app);
}
}
3) Startup.Auth.cs
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.MapSignalR<Services.Realtime.SynchronizationConnection>("/test");
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
}
4)客户端javascript
var connection = $.connection('/test');
connection.logging = true;
console.log('Receiving connection');
connection.received(function (data) {
console.log('received');
});
connection.disconnected(function () {
console.log('disconnected');
});
connection.error(function (data) {
console.log('error');
});
connection.start().done(function () {
console.log('Connection started');
});
由于缺少[Authorize]属性,我见过有关null User.Identity.Name的问题。就我而言,我甚至无法访问User.Identity。我的动作也有[授权]属性,包含客户端javascript。
答案 0 :(得分:0)
在OnConnected
方法的内部,您可以使用:
request.User
这将带有连接时IPrincipal
中的HttpContext.Current.User
,这是您应该注意的。
如果您需要更改IPrincipal
(例如删除由Forms身份验证生成的默认设置并自行设置),我建议您使用IHttpModule
。 SignalR中的所有传输至少以HTTP(甚至是WebSockets)开始,因此所有传输都将至少在连接期间到达模块。
干杯。
答案 1 :(得分:0)
我遇到了同样的问题:在PersistentConnection的OnConnected()方法中,request.User为null。更改我初始化SignalR的顺序,我的身份验证提供程序修复了它。我更改了它,以便在配置了我的身份验证后映射
url($a->poly)