【问题标题】:SignalR Context.User is null on OnConnectedSignalR Context.User 在 OnConnected 上为空
【发布时间】:2015-12-21 13:21:09
【问题描述】:

我正在开发一个使用 Angularjs 和 Asp.net Web API 的 UI 应用程序。对于实时更新,我使用 SignalR。 Web API 和 SignalR 托管在不同的进程中。 Web API 将对用户进行身份验证并返回一个令牌。我将查询字符串中的相同令牌发送到 SignalR 以进行授权。授权代码运行成功,但 OnConnected 方法中的 Context.User 为空,但在 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;
        }
    }
}

【问题讨论】:

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

标签: signalr signalr-hub


【解决方案1】:

这可能与调用signalr configuration auth configuration和web api configuration的顺序有关。您必须在配置 web api 之前调用 mapsignalr。不幸的是,我不知道如何在 mapsignalr 函数之前调用 web api 的配置。因为我的web api配置是从global.asaxGlobalConfiguration.Configure(WebApiConfig.Register);触发的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多