【问题标题】:500 /signalr/negotiate for deployed app in Azure500 /signalr/negotiate 在 Azure 中部署的应用程序
【发布时间】:2017-01-15 19:13:47
【问题描述】:

部署到 Azure 时,SignalR 在 localhost 上不起作用,但部署到 Azure 时不起作用

在执行信号器/协商请求时,它会以 500 内部服务器错误响应进行响应。

手动导航到协商 url,我得到了更详细的错误解释。
'CryptographicException: 数据保护操作不成功...'

使用 IISExpress 在本地一切正常。

我该如何解决这个问题?

【问题讨论】:

    标签: azure signalr


    【解决方案1】:

    我认为这是解决方案。这对我有用,无需进行任何代码更改:

    Azure WebApps 默认配置为不加载用户配置文件,这会导致异常。在 Azure 应用程序设置中,创建一个名为 WEBSITE_LOAD_USER_PROFILE 的应用程序设置并将其设置为 1。这将加载用户配置文件。

    https://www.magnetismsolutions.com/blog/jaredjohnson/2015/12/18/resolving-cryptography-issues-with-the-dynamics-crm-sdk-in-azure-web-apps

    【讨论】:

      【解决方案2】:

      搞定了。我需要使用 appBuilder。SetDataProtectionProvider

      app.UseAppBuilder(appBuilder =>
              {
                  appBuilder.SetDataProtectionProvider(new MachineKeyProtectionProvider());
      
                  appBuilder.Map("/signalr", map =>
                  {
                      var hubConfiguration = new HubConfiguration
                      {
                          EnableDetailedErrors = true
                      };
      
                      map.RunSignalR(hubConfiguration);
                  });
      
      
              });
      

      我使用 katana 扩展方法 将 IAppBuilder 连接到 IApplicationBuilder。 这允许您的 owin 中间件连接到 asp.net 核心。使用 RunSignalr 方法很重要。

      内部类 MachineKeyProtectionProvider:IDataProtectionProvider { 公共 IDataProtector 创建(参数字符串 [] 用途) { 返回新的 MachineKeyDataProtector(用途); } }

      internal class MachineKeyDataProtector : IDataProtector
      {
          private readonly string[] _purposes;
      
          public MachineKeyDataProtector(string[] purposes)
          {
              _purposes = purposes;
          }
      
          public byte[] Protect(byte[] userData)
          {
              //return MachineKey.Protect(userData, _purposes);
              return userData;
          }
      
          public byte[] Unprotect(byte[] protectedData)
          {
              //return System.Web.Security.MachineKey.Unprotect(protectedData, _purposes);
              return protectedData;
          }
      }
      

      【讨论】:

      • 这是非常不安全的。您可以在此处阅读有关如何使用数据保护来加密连接令牌的信息:asp.net/signalr/overview/security/…。我认为您可能缺少的是机器密钥。
      • @Pawel:我同意这是不安全的。忘了说这个解决方案并不适合生产环境。
      猜你喜欢
      • 2017-02-15
      • 1970-01-01
      • 2017-02-25
      • 2014-04-29
      • 2017-09-09
      • 2023-03-08
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      相关资源
      最近更新 更多