【发布时间】:2015-12-21 13:21:09
【问题描述】:
我正在开发一个使用 Angularjs 和 Asp.net Web API 的 UI 应用程序。对于实时更新,我使用 SignalR。 Web API 和 SignalR 托管在不同的进程中。 Web API 将对用户进行身份验证并返回一个令牌。我将查询字符串中的相同令牌发送到 SignalR 以进行授权。授权代码运行成功,但 OnConnected 方法中的 Context.User 为空,但在 Register hub 方法中,主体设置正确。
请在下面找到代码。提前感谢您的帮助。
[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 将其作为消息发送?
标签: signalr signalr-hub