HttpContext.Current.User在OnConnected with Asp.Net Identity中为null

时间:2014-01-28 08:50:23

标签: asp.net asp.net-mvc signalr asp.net-mvc-5 asp.net-identity

我从模板中创建了两个项目。

第一个包含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。

2 个答案:

答案 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)