获取从 SignalR.AuthorizeAttribute 到 SignalR.Hub 的会话
Get Session from SignalR.AuthorizeAttribute to SignalR.Hub
我正在开发 SignalR.Hub 并且我在 SignalR.AuthorizeAttribute 中有自定义授权。我一直在尝试通过我必须检索的会话,以确认用户已通过身份验证以使用集线器。
我查看了所有属性,它们似乎大多是只读的。我可以向 SignalR.IRequest.Environment 添加一些内容,但它似乎不是线程安全的,而且似乎不合适。
我可以扩展 HubCallerContext + 一切使用它的方式来增加我的会话吗?
自定义授权
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class HubAuthorize : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
return VerifySession(request);
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
{
//Could I add something to the HubIncomingInvokerContext?
return VerifySession(hubIncomingInvokerContext.Hub.Context.Request);
}
public bool VerifySession(IRequest request)
{
bool success = false;
string token = "";
bool isApiToken = false;
// Check for token Header Auth
if (string.IsNullOrWhiteSpace(token))
{
token = request.QueryString["X-Custom-Token"];
if (string.IsNullOrWhiteSpace(token))
{
token = request.QueryString["X-Custom-Token"];
isApiToken = true;
}
}
SessionResponse session = null;
if (!string.IsNullOrWhiteSpace(token))
{
session = isApiToken ? ValidateApiToken(token) : ValidateToken(token);
}
if (session != null)
{
//Add Session to request! So I dont have to hit the db again..
//request.Add(new KeyValuePair<string, object>("session", session));
success = true;
}
return success;
}
//... other methods that aren't relevant
}
枢纽
[HubAuthorize]
public class NotificationHub : Hub
{
public void Send(string name, string message)
{
// Use the session here
Clients.All.broadcastMessage(name, message);
}
public override Task OnConnected()
{
Console.WriteLine(Context.ConnectionId);
return base.OnConnected();
}
}
如果在验证您已通过身份验证时不能使用自定义授权来检索会话,为什么还要自定义授权?也许我错过了一些东西,但它非常令人沮丧。 /endrant
看来你不能。我仍然在 HubAuthorize.AuthorizeHubConnection 中验证会话,然后在 NotificationHub.OnConnected 中构建一个 Context.ConnectionId 的字典作为键,并在第二次检索会话时获取值。感觉有点黑,但似乎没有什么好方法可以防止人们在不使用 .Net 内置身份验证的情况下访问集线器。
我正在开发 SignalR.Hub 并且我在 SignalR.AuthorizeAttribute 中有自定义授权。我一直在尝试通过我必须检索的会话,以确认用户已通过身份验证以使用集线器。
我查看了所有属性,它们似乎大多是只读的。我可以向 SignalR.IRequest.Environment 添加一些内容,但它似乎不是线程安全的,而且似乎不合适。
我可以扩展 HubCallerContext + 一切使用它的方式来增加我的会话吗?
自定义授权
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class HubAuthorize : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
return VerifySession(request);
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
{
//Could I add something to the HubIncomingInvokerContext?
return VerifySession(hubIncomingInvokerContext.Hub.Context.Request);
}
public bool VerifySession(IRequest request)
{
bool success = false;
string token = "";
bool isApiToken = false;
// Check for token Header Auth
if (string.IsNullOrWhiteSpace(token))
{
token = request.QueryString["X-Custom-Token"];
if (string.IsNullOrWhiteSpace(token))
{
token = request.QueryString["X-Custom-Token"];
isApiToken = true;
}
}
SessionResponse session = null;
if (!string.IsNullOrWhiteSpace(token))
{
session = isApiToken ? ValidateApiToken(token) : ValidateToken(token);
}
if (session != null)
{
//Add Session to request! So I dont have to hit the db again..
//request.Add(new KeyValuePair<string, object>("session", session));
success = true;
}
return success;
}
//... other methods that aren't relevant
}
枢纽
[HubAuthorize]
public class NotificationHub : Hub
{
public void Send(string name, string message)
{
// Use the session here
Clients.All.broadcastMessage(name, message);
}
public override Task OnConnected()
{
Console.WriteLine(Context.ConnectionId);
return base.OnConnected();
}
}
如果在验证您已通过身份验证时不能使用自定义授权来检索会话,为什么还要自定义授权?也许我错过了一些东西,但它非常令人沮丧。 /endrant
看来你不能。我仍然在 HubAuthorize.AuthorizeHubConnection 中验证会话,然后在 NotificationHub.OnConnected 中构建一个 Context.ConnectionId 的字典作为键,并在第二次检索会话时获取值。感觉有点黑,但似乎没有什么好方法可以防止人们在不使用 .Net 内置身份验证的情况下访问集线器。