【发布时间】:2014-02-11 04:19:26
【问题描述】:
我一直在构建一个 Web 服务,到目前为止,它完全由 ASP.NET Web API 调用组成。我现在需要将 SignalR 添加到组合中,但我想知道如何保持安全方面的一致性。
我目前正在使用 OAuth 持有者令牌(使用 OWIN 身份验证),因此我的客户端基本上会有一个 access_token,我通常只需将其添加到任何 Web API 调用的标头中。但是,我如何对 SignalR 执行相同(或类似)操作?我会在创建连接时或每次通话时进行身份验证吗?而且,最重要的是,我如何首先指定访问令牌?
谢谢。
【问题讨论】:
-
JavaScript WebSocket API 不允许设置请求标头。您最好的选择是在请求 url 查询字符串上设置 access_token。
-
谢谢。我可以这样做,但是如何配置服务器端以读取查询字符串并确定和设置集线器的身份?
-
@Barguast 您可以创建一个 HubPipelineModule 来设置有效令牌的用户身份或拒绝无效令牌的访问。您需要重写以使其工作的两种方法是
OnBeforeConnect和OnBeforeIncoming。 msdn.microsoft.com/en-us/library/… -
谢谢。希望在某处有更多关于此的内容?我可以看到模块如何拦截请求,以及可能如何解密令牌(虽然它会很混乱),但我看不到如何在上下文中看到 User 属性。我曾假设我必须做的工作是配置 OWIN 而不是 SignalR。
-
我想我已经取得了一些进展。我已经按照这个问题的答案:stackoverflow.com/questions/20585872/…,现在能够在查询字符串中提供访问令牌并在服务器上从中获取身份。我的 WebAPI 控制器现在都从 Authorization 标头或查询字符串获取主体。但是,SignalR 中的 User 属性仍然是默认的“未验证”值!如何在 OWIN 配置中设置该属性的值?