【问题标题】:SignalR and Web Api - How to modify the Hub classSignalR 和 Web Api - 如何修改 Hub 类
【发布时间】:2016-04-05 15:42:46
【问题描述】:

我希望通知客户端我的 Web Api 其他客户端已使用 SignalR 进行身份验证。我了解 SignalR 的基础知识,但我对如何修改集线器使其可以处理 API 请求感到困惑。

客户端是一个单页应用程序,它使用 jQuery 调用 Web Api。客户端首先通过 API 进行身份验证,然后才能使用任何 API 端点。

还应该补充一点,我在与 Web Api 相同的项目中使用 OAuth 进行身份验证。

【问题讨论】:

  • 嗯,客户端可以在认证后通知服务器。然后,服务器可以将消息广播给所有其他客户端(例如在信号员聊天中)
  • @alessalessio - 这听起来正是我想要的。如何将 SignalR 调用添加到 Web Api 的身份验证中?使 jQuery 调用进行身份验证的 HTML 页面是否必须包含 SignalR 脚本,如 SignalR 聊天示例?你有任何示例代码吗?
  • 不清楚您的客户是如何进行身份验证的,他们是否在与 Web API 相同的项目中使用 OAuth 进行身份验证?你在使用 Microsoft.Owin.Security.OAuth 吗?
  • @FedericoDipuma - 抱歉我没有提到。是的,我在与 Web Api 相同的项目中使用 OAuth。

标签: asp.net-web-api signalr


【解决方案1】:

好吧,这里最简单的方法是在 oauth 身份验证通量中获取对 signalR hub 的引用,然后在此方法成功完成后启动全局信令:Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

例如:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        // auth and other stuffs removed for brevity
        // ...
        // ...
        context.Validated(ticket);

        // then here
        var hub = GlobalHost.ConnectionManager.GetHubContext<IMessageHub>("MessageHub");
        hub.Clients.All.ServerMessage(new {message = $"{context.UserName} is here!"});

    }

使用这样的消息中心:

public interface IMessageHub
{
    void ServerMessage(object eventObject);
}

[HubName("MessageHub"), Authorize]
public class MessageHub : Hub<IMessageHub>
{
    public MessageHub()
    {

    }
}

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多