Signalr 信号器上下文。用户在未连接上为空
我正在开发一个使用Angularjs和Asp.net web API的UI应用程序。对于实时更新,我使用信号器。Web API和SignalR托管在单独的进程中。Web API将对用户进行身份验证并返回令牌。我正在向信号器发送查询字符串中的相同令牌以进行授权。授权代码成功运行,但Context.User在OnConnected方法中为null,但在Register hub方法中主体设置正确 请在下面查找代码。提前感谢您的帮助Signalr 信号器上下文。用户在未连接上为空,signalr,signalr-hub,Signalr,Signalr Hub,我正在开发一个使用Angularjs和Asp.net web API的UI应用程序。对于实时更新,我使用信号器。Web API和SignalR托管在单独的进程中。Web API将对用户进行身份验证并返回令牌。我正在向信号器发送查询字符串中的相同令牌以进行授权。授权代码成功运行,但Context.User在OnConnected方法中为null,但在Register hub方法中主体设置正确 请在下面查找代码。提前感谢您的帮助 [TokenAuthorize] public class MyHub
[TokenAuthorize]
public class MyHub : Hub
{
public void Register(string token)
{
// Context.User is set to the appropiate principal
}
public override Task OnConnected()
{
//Context user is set to null
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
return base.OnDisconnected(stopCalled);
}
}
public class TokenAuthorizeAttribute : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
var tokenId = request.QueryString.Get("Token");
try
{
var principal = TokeService.ValidateToken(tokenId);
if (principal != null)
{
Thread.CurrentPrincipal = principal;
request.Environment["server.User"] = principal;
return true;
}
}
catch (Exception)
{
return false;
}
return false;
}
public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext,
bool appliesToMethod)
{
var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId;
var environment = hubIncomingInvokerContext.Hub.Context.Request.Environment;
var principal = environment["server.User"] as ClaimsPrincipal;
if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated)
{
hubIncomingInvokerContext.Hub.Context = new HubCallerContext(new ServerRequest(environment),
connectionId);
return true;
}
return false;
}
protected override bool UserAuthorized(System.Security.Principal.IPrincipal user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
var principal = user as ClaimsPrincipal;
if (principal != null)
{
Claim authenticated = principal.FindFirst(ClaimTypes.Authentication);
if (authenticated != null && authenticated.Value == "true")
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
它可能与调用信号器配置auth配置和web api配置的顺序有关。您必须在配置web api之前调用MapSignal。不幸的是,我不知道如何在MapSignal函数之前调用web api的配置。因为我的web api配置是从global.asax
GlobalConfiguration.Configure(WebApiConfig.Register)触发的代码>为什么不使用singalr将其作为消息发送?