Я пытаюсь разрешить запросы SignalR именно с использованием примера проекта здесь AngularJS Authentication на основе этого проекта AngularJS Authentication using web tokens. Проблема я имею, использовать авторизацию SignalR, мне пришлось переопределить класс SignalR AuthorizeAttribute
, как показано ниже:SignalR Авторизация с использованием Web API Token
public class QueryStringBearerAuthorizeAttribute : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
var token = request.QueryString.Get("Bearer");
var authenticationTicket = Startup.AuthServerOptions.AccessTokenFormat.Unprotect(token);
if (authenticationTicket == null || authenticationTicket.Identity == null || !authenticationTicket.Identity.IsAuthenticated)
{
return false;
}
request.Environment["server.User"] = new ClaimsPrincipal(authenticationTicket.Identity);
request.Environment["server.Username"] = authenticationTicket.Identity.Name;
request.GetHttpContext().User = new ClaimsPrincipal(authenticationTicket.Identity);
return true;
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
{
var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId;
var environment = hubIncomingInvokerContext.Hub.Context.Request.Environment;
var principal = environment["server.User"] as ClaimsPrincipal;
if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated)
{
hubIncomingInvokerContext.Hub.Context = new HubCallerContext(new ServerRequest(environment), connectionId);
return true;
}
return false;
}
}
Теперь мой хаб, как показано ниже:
[QueryStringBearerAuthorize]
[HubName("realtime")]
public class WislerAppHub : Hub
{
public string GetServerTime()
{
return DateTime.UtcNow.ToString();
}
}
Идея заключается в том, когда сигнал соединения signalr попадает в этот класс, AuthorizeHubConnection
должен запускать и разрешать его. Однако этот метод никогда не называется. Второй метод называется AuthorizeHubMethodInvocation
.
Что я делаю неправильно? Почему это переопределение не работает? Кстати, я пробовал наследовать таким образом: QueryStringBearerAuthorizeAttribute : Attribute, IAuthorizeHubConnection, IAuthorizeHubMethodInvocation
с тем же результатом.
спасибо.
... вы изменили его на то, что именно? У меня есть аналогичная проблема, но у меня есть 'connection.start()' на стороне клиента, поэтому я не уверен, что мне здесь не хватает ... – veljkoz