Signalr 信号器上下文。用户在未连接上为空

Signalr 信号器上下文。用户在未连接上为空,signalr,signalr-hub,Signalr,Signalr Hub,我正在开发一个使用Angularjs和Asp.net web API的UI应用程序。对于实时更新,我使用信号器。Web API和SignalR托管在单独的进程中。Web API将对用户进行身份验证并返回令牌。我正在向信号器发送查询字符串中的相同令牌以进行授权。授权代码成功运行,但Context.User在OnConnected方法中为null,但在Register hub方法中主体设置正确 请在下面查找代码。提前感谢您的帮助 [TokenAuthorize] public class MyHub

我正在开发一个使用Angularjs和Asp.net web API的UI应用程序。对于实时更新,我使用信号器。Web API和SignalR托管在单独的进程中。Web API将对用户进行身份验证并返回令牌。我正在向信号器发送查询字符串中的相同令牌以进行授权。授权代码成功运行,但Context.User在OnConnected方法中为null,但在Register hub方法中主体设置正确

请在下面查找代码。提前感谢您的帮助

[TokenAuthorize]
public class MyHub : Hub
{
    public void Register(string token)
    {
      // Context.User is set to the appropiate principal
    }

    public override Task OnConnected()
    {
        //Context user is set to null
    return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        return base.OnDisconnected(stopCalled);

    }
}

public class TokenAuthorizeAttribute : AuthorizeAttribute
{

    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
    {
        var tokenId = request.QueryString.Get("Token");
        try
        {
            var principal = TokeService.ValidateToken(tokenId);
            if (principal != null)
            {
                Thread.CurrentPrincipal = principal;
                request.Environment["server.User"] = principal;

                return true;
            }
        }
        catch (Exception)
        {
            return false;
        }         

        return false;

    }

    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;
    }


    protected override bool UserAuthorized(System.Security.Principal.IPrincipal user)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }

        var principal = user as ClaimsPrincipal;

        if (principal != null)
        {
            Claim authenticated = principal.FindFirst(ClaimTypes.Authentication);
            if (authenticated != null && authenticated.Value == "true")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
}

它可能与调用信号器配置auth配置和web api配置的顺序有关。您必须在配置web api之前调用MapSignal。不幸的是,我不知道如何在MapSignal函数之前调用web api的配置。因为我的web api配置是从global.asax
GlobalConfiguration.Configure(WebApiConfig.Register)触发的

为什么不使用singalr将其作为消息发送?