OnConnected上的SignalR Context.User为空
问题描述:
我正在使用Angularjs和Asp.net Web API的UI应用程序。对于实时更新,我使用SignalR。 Web API和SignalR由不同的进程托管。 Web API将认证用户并返回令牌。我将查询字符串中的相同标记发送给SignalR进行授权。授权代码成功运行,但Context.User在OnConnected方法内为null,但在注册中心方法中,主体已正确设置。OnConnected上的SignalR Context.User为空
请找到下面的代码。预先感谢您的帮助。
[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;
}
}
}
答
它有可能是与其中signalr配置身份验证配置和Web API配置的调用顺序。您必须在配置web api之前调用mapsignalr。不幸的是,我不知道如何在mapsignalr函数之前调用web api的配置。因为我的web api配置是从global.asax触发的GlobalConfiguration.Configure(WebApiConfig.Register);
为什么你不使用singalr作为消息发送它? – cpoDesign