【问题标题】:SignalR Authentication through AuthToken in Connection HeaderSignalR 通过连接标头中的 AuthToken 进行身份验证
【发布时间】:2016-02-19 23:16:07
【问题描述】:

我让 BasicAuth 和 WindowsAuth 在我的 SignalR 项目中工作。 现在我正在寻找其他身份验证方式(不需要 Win/AD 帐户)。

在阅读 SignalR 文档时,我偶然发现了在连接标头中提供身份验证令牌的可能性: http://www.asp.net/signalr/overview/security/hub-authorization#header

它声明“然后,在集线器中,您将验证用户的令牌。” 我可以让 OnConnected 方法匿名访问并获取如下令牌,然后对其进行验证:

var test = Context.Request.Headers["mytoken"];

但是下一步会是什么?我需要将连接的用户设置为经过身份验证的用户,但我该如何手动设置?

我的总体目标是拥有一种非常简单的身份验证方法,即在服务器端验证的“硬编码”令牌并授予对已启用授权的其他方法的访问权限。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# authentication signalr signalr-hub


    【解决方案1】:

    我也遇到过类似的问题。我找到了一种创建新 AuthorizeAttribute 的解决方法。接下来,我用这个属性修饰了方法。发出请求时,该属性会检查令牌并授予访问权限或不访问权限。 代码如下:

    [AttributeUsage(AttributeTargets.Method)]
    internal class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        public override bool AuthorizeHubMethodInvocation(Microsoft.AspNet.SignalR.Hubs.IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
        {
            string token = hubIncomingInvokerContext.Hub.Context.Headers["AuthenticationToken"];
    
            if (string.IsNullOrEmpty(token))
                return false;
            else
            {
                string decryptedValue = Encryptor.Decrypt(token, Encryptor.Password);
    
                string[] values = decryptedValue.Split(';');
    
                string userName = values[0],
                    deviceId = values[1],
                    connectionId = values[2];
    
                bool b = ...CanAccess()...;
    
                return b;
            }
        }
    }
    

    要拥有用户名,您只需在 Hub 中添加一个属性,该属性读取令牌、解析令牌并返回用户名。 不过,仍然不能使用 Context.User.Identity。希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多