0

Я создал два проекта из шаблонов.HttpContext.Current.User имеет значение null в OnConnected с идентификатором Asp.Net

Первый содержит членство и MVC4. А второй использует MVC5 и Identity Asp.Net.

Затем я добавил сигналR к обоим проектам, используя тот же код.

В проекте «Членство» я могу получить доступ к HttpContext.User как в контроллерах, так и в классе соединений SignalR (метод OnConnected). Но в проекте 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) запуска. 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] атрибут. В моем случае я не могу получить доступ даже к User.Identity. Также у меня есть атрибут [Авторизовать] для моего действия, которое содержит javascript клиента.

+0

Как вы разрешили его? –

ответ

0

Внутри метода OnConnected, вы можете использовать:

request.User 

Это будет нести IPrincipal, который был в HttpContext.Current.User в момент соединения, и это один вы должны возражать.

Если вам необходимо изменить это значение IPrincipal (например, удалить стандартную версию, сгенерированную с помощью проверки подлинности с помощью форм и установить ее самостоятельно), я рекомендую вам использовать IHttpModule. Все транспорты в SignalR по крайней мере начинаются как HTTP (даже WebSockets), поэтому все транспорты будут попадать в модуль по крайней мере во время соединения.

Cheers.

+0

Я попробовал request.User сначала. Это тоже нулевое значение. Прошу прощения за неточность. –

0

У меня была та же проблема: request.User был null в методе OnConnected() PersistentConnection. Менял порядок, в котором я инициализировал 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"); 
Смежные вопросы