从SignalR.AuthorizeAttribute获取Session到SignalR.Hub

时间:2017-01-25 01:02:23

标签: c# asp.net session signalr 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
}

The Hub

[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

1 个答案:

答案 0 :(得分:0)

好像你不能。我仍然在HubAuthorize.AuthorizeHubConnection中验证会话,然后在NotificationHub.OnConnected中构建一个Context.ConnectionId字典作为键,并为该值的次要时间检索会话。感觉很乱,但似乎没有一种好方法可以阻止人们在不使用.Net内置身份验证的情况下访问集线器。