C# 通过连接头中的AuthToken进行信号器身份验证

C# 通过连接头中的AuthToken进行信号器身份验证,c#,authentication,signalr,signalr-hub,C#,Authentication,Signalr,Signalr Hub,我让BasicAuth和WindowsAuth在我的信号器项目中工作。 现在我正在寻找其他身份验证方法(不需要Win/AD帐户) 在阅读SignalR文档时,我偶然发现了在连接头中提供身份验证令牌的可能性: 它声明“然后,在集线器中,您将验证用户的令牌。” 我可以使OnConnected方法匿名访问,并获得如下令牌,然后对其进行验证: var test = Context.Request.Headers["mytoken"]; 但下一步是什么?我需要将连接的用户设置为经过身份验证的用户,但如

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

在阅读SignalR文档时,我偶然发现了在连接头中提供身份验证令牌的可能性:

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

var test = Context.Request.Headers["mytoken"];
但下一步是什么?我需要将连接的用户设置为经过身份验证的用户,但如何手动执行此操作

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


任何帮助都将不胜感激。

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

[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;
        }
    }
}
要获得用户名,只需在中心中添加一个属性,该属性读取令牌、解析令牌并返回用户名。
但仍然无法使用Context.User.Identity。我希望有帮助。

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

[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;
        }
    }
}
要获得用户名,只需在中心中添加一个属性,该属性读取令牌、解析令牌并返回用户名。 但仍然无法使用Context.User.Identity。我希望有帮助