获取从 SignalR.AuthorizeAttribute 到 SignalR.Hub 的会话

Get Session from SignalR.AuthorizeAttribute to SignalR.Hub

我正在开发 SignalR.Hub 并且我在 SignalR.AuthorizeAttribute 中有自定义授权。我一直在尝试通过我必须检索的会话,以确认用户已通过身份验证以使用集线器。

我查看了所有属性,它们似乎大多是只读的。我可以向 SignalR.IRequest.Environment 添加一些内容,但它似乎不是线程安全的,而且似乎不合适。

我可以扩展 HubCallerContext + 一切使用它的方式来增加我的会话吗?

自定义授权

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class HubAuthorize : AuthorizeAttribute
{
    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
    {
        return VerifySession(request);
    }

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
    {
        //Could I add something to the HubIncomingInvokerContext?
        return VerifySession(hubIncomingInvokerContext.Hub.Context.Request);
    }

    public bool VerifySession(IRequest request)
    {
        bool success = false;
        string token = "";
        bool isApiToken = false;

        // Check for token Header Auth
        if (string.IsNullOrWhiteSpace(token))
        {
            token = request.QueryString["X-Custom-Token"];
            if (string.IsNullOrWhiteSpace(token))
            {
                token = request.QueryString["X-Custom-Token"];
                isApiToken = true;
            }
        }

        SessionResponse session = null;
        if (!string.IsNullOrWhiteSpace(token))
        {
            session = isApiToken ? ValidateApiToken(token) : ValidateToken(token);
        }

        if (session != null)
        {
            //Add Session to request! So I dont have to hit the db again..
            //request.Add(new KeyValuePair<string, object>("session", session));
            success = true;
        }
        return success;
    }

    //... other methods that aren't relevant
}

枢纽

[HubAuthorize]
public class NotificationHub : Hub
{
    public void Send(string name, string message)
    {
        // Use the session here
        Clients.All.broadcastMessage(name, message);
    }

    public override Task OnConnected()
    {
        Console.WriteLine(Context.ConnectionId);
        return base.OnConnected();
    }
}

如果在验证您已通过身份验证时不能使用自定义授权来检索会话,为什么还要自定义授权?也许我错过了一些东西,但它非常令人沮丧。 /endrant

看来你不能。我仍然在 HubAuthorize.AuthorizeHubConnection 中验证会话,然后在 NotificationHub.OnConnected 中构建一个 Context.ConnectionId 的字典作为键,并在第二次检索会话时获取值。感觉有点黑,但似乎没有什么好方法可以防止人们在不使用 .Net 内置身份验证的情况下访问集线器。