500 /signalr/negotiate 在 Azure 中部署的应用程序

Posted

技术标签:

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

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

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

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

使用 IISExpress 在本地一切正常。

我该如何解决这个问题?

【问题讨论】:

【参考方案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:我同意这是不安全的。忘了说这个解决方案并不适合生产环境。

以上是关于500 /signalr/negotiate 在 Azure 中部署的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

带有jquery mobile的signalR导致很多问题

如何使用信号器允许 cors

信号器 CORS 问题

wordpress程序安装时提示500错误

500错误原因解决方法

在 500 毫秒内更改 JButton 颜色