Я работаю над пользовательским интерфейсом, использующим веб-API Angularjs и Asp.net. Для обновлений в реальном времени я использую SignalR. Web API и SignalR размещаются в отдельных процессах. Web API будет аутентифицировать пользователя и вернуть токен. Я посылаю тот же токен в строке запроса в SignalR для авторизации. Код авторизации запускается успешно, но Context.User имеет значение null в методе OnConnected, но в рамках метода концентратора Register основной элемент установлен правильно.SignalR Context.User is null on OnConnected
Пожалуйста, найдите код ниже. Заранее благодарю за любую помощь.
[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;
}
}
}
Почему вы не отправляете его как сообщение с помощью singalr? – cpoDesign