httpcontext.current.user与ASP.NET身份的连接无效



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

第一个包含会员资格和MVC4。第二种使用MVC5和ASP.NET身份。

然后,我使用相同的代码向两个项目添加了Signalr。

在会员项目中,我可以在控制器和SignalR连接类中访问httpcontext.user(ONCONETECT方法)。但是在身份项目中,我仅在控制器中才有httpcontext.user的适当价值。在连接的方法中httpcontext.user返回null。

signalr的代码在两个项目中都是相同的:

1)同步Connection.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');
});

由于缺少[授权]属性,我已经看到了有关null user.Identity.name的问题。就我而言,我什至无法访问用户。我也有[授权]属性,其中包含客户端JavaScript。

OnConnected方法内,您可以使用:

request.User

连接时将携带HttpContext.Current.User中的IPrincipal,这是您应该介意的。

如果您需要更改该IPrincipal(例如,删除由表单身份验证生成的默认一个并设置自己的默认值),我建议您使用IHttpModule。SignalR中的所有传输至少从HTTP开始(甚至是WebSocket),因此所有传输都至少在连接期间都会击中模块。

欢呼。

我也有同样的问题:request.user在persistentConnection的onconnected()方法中无效。更改我初始化Signalr和我的身份验证提供商修复的顺序。我更改了它,以便在配置我的身份验证后,我的SignalR端点映射

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    ExpireTimeSpan = new TimeSpan(999, 0, 0, 0),
    SlidingExpiration = true
});
GlobalConfiguration.Configuration.UseSqlServerStorage("MyDatabase", new SqlServerStorageOptions() { PrepareSchemaIfNecessary = false });
app.MapSignalR<MyConnection>("/MyConnection");

相关内容

  • 没有找到相关文章

最新更新