【问题标题】:SignalR authentication for persistent connection from Silverlight client来自 Silverlight 客户端的持久连接的 SignalR 身份验证
【发布时间】:2013-06-28 22:37:50
【问题描述】:

从大约 0.4.0 SignalR 的自定义版本升级,我发现身份验证不再有效。

我有一个 RIA 服务应用程序,带有表单身份验证(基于股票 AuthenticationBase)和 HttpContext.Current,从用于携带用户身份的 PersistentConnection 的处理程序访问。在 IIS 日志中,我看到身份仍然通过 RIA 请求传递。

升级到最新的 SignalR 我观察到身份在传入的 HttpContext 或 IRequest 中都不可用。从 Fiddler 日志中,请求被 403 拒绝并且不发送凭据。

将 Connection.Credentials 设置为 new NetworkCredentials() 不会改变任何内容。

查看源代码和完全不足的documentation 并没有产生任何见解。如果有人能够从 Silverlight 客户端到 ASP.NET 托管的 PersistentConnection 运行经过身份验证的连接,我将非常感谢任何指针!

PS:我也很好奇浏览器的网络追踪不再显示 SignalR 的流量,这是怎么回事?

【问题讨论】:

  • SignalR 流量使用 Http 客户端发送,阅读此文档:msdn.microsoft.com/en-us/library/dd920295(v=vs.95).aspx
  • 有一点可能让您感到困扰的是,更高版本的 SignalR 使用客户端堆栈而不是浏览器堆栈。
  • 这可以解释这两个观察结果,谢谢!现在我只需要弄清楚如何强制它重新使用浏览器请求管道......

标签: signalr signalr.client


【解决方案1】:

您是否尝试通过域边界进行连接?在这种情况下,还需要采取其他步骤 - 请参阅下一页的“403 禁止”部分:

http://www.asp.net/signalr/overview/troubleshooting-and-debugging/troubleshooting

【讨论】:

    【解决方案2】:

    AuthorizeRequest 方法被调用两次。 第一次您的请求没有发送 auth 标头并且 AuthorizeRequest 应该返回 false,然后 SignalR 堆栈在内部生成一个带有 401 Unauthorized 的 http 响应。然后,这次创建第二个请求发送身份验证标头,您应该在 IRequest.User.Identity.Name 中看到用户名

    【讨论】:

      【解决方案3】:

      一个简单的解决方案是将 SignalR/src/Microsoft.AspNet.SignalR.Client/Http/HttpHelper.cs 行号 150 更改为

      request = (HttpWebRequest)System.Net.Browser.WebRequestCreator.BrowserHttp.Create(new Uri(url));

      而不是

      request = (HttpWebRequest)System.Net.Browser.WebRequestCreator.ClientHttp.Create(new Uri(url));

      当连接的客户端是 silverlight 时,这将强制 signalR 使用浏览器堆栈而不是客户端堆栈。

      【讨论】:

      • 我确实试过了。它有点工作。最后我还是回到了旧版本,因为差异太多,我没有时间也不想解决它们。
      猜你喜欢
      • 1970-01-01
      • 2014-02-07
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多