通过连接头中的AuthToken进行SignalR认证

时间:2015-08-23 02:06:21

标签: c# authentication signalr signalr-hub

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

在阅读SignalR文档时,我偶然发现了在连接头中提供auth令牌的可能性: How do I take the Cartesian join of two lists in c#?

它声明"然后,在集线器中,您将验证用户的令牌。" 我可以匿名访问OnConnected方法并获取如下所示的令牌,然后验证它:

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

但下一步会怎样?我需要将连接的用户设置为经过身份验证的用户,但我该如何手动执行此操作?

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我遇到过类似的问题。我发现了一种创建新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。我希望它有所帮助。