使用网络API令牌进行SignalR授权

 2023-02-15    300  

问题描述

我试图使用此处的示例项目授权信号授权请求 AngularJS身份验证基于此项目 Angularjs使用Web令牌的身份验证.我所拥有的问题是使用信号授权,我必须覆盖SignalSR AuthorizeAttribute类,如下所示:

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

现在我的集线器如下:

使用网络API令牌进行SignalR授权

[QueryStringBearerAuthorize]
[HubName("realtime")] 
public class WislerAppHub : Hub
{
    public string GetServerTime()
    {            
        return DateTime.UtcNow.ToString();
    }       
}

这个想法是,当信号态连接请求命中此类时,AuthorizeHubConnection应该触发并授权它.但是,从未调用此方法.虽然被调用第二种方法AuthorizeHubMethodInvocation.

我做错了什么?为什么不覆盖工作? BTW我尝试继承:QueryStringBearerAuthorizeAttribute : Attribute, IAuthorizeHubConnection, IAuthorizeHubMethodInvocation具有相同的结果.

谢谢.

推荐答案

好的我得到它的工作.对于那些在这里到达类似问题的人来说,上面的代码运作良好,它没有问题.服务器端没有任何内容(即,此代码)

问题在于信号初始化和来自客户端的呼叫.不知何故,我假设没有道路可以先击中集线器,而不首先击中属性.显然有!我刚刚改变了我的AngularJS代码并工作.

以上所述是小编给大家介绍的使用网络API令牌进行SignalR授权,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/33803.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。