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 中部署的应用程序的主要内容,如果未能解决你的问题,请参考以下文章