我在我的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"硬编码"在服务器端验证的令牌,并授予对已启用授权的其他方法的访问权限。
任何帮助都将不胜感激。
答案 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。我希望它有所帮助。