C# asp.net core 2.0部署-InvalidOperationException:无法解密反伪造令牌

C# asp.net core 2.0部署-InvalidOperationException:无法解密反伪造令牌,c#,asp.net,asp.net-core,C#,Asp.net,Asp.net Core,最近,我在我的公司开发了一个asp.net core 2.0 web应用程序,在调试模式下工作得非常好,但是当我在测试服务器中部署到IIS时,我们尝试从客户端计算机执行时,遇到了一个问题: An unhandled exception occurred while processing the request. CryptographicException: The key {0851ad3b-df33-4cf7-8c3a-5c637adaa713} was not found in the k

最近,我在我的公司开发了一个asp.net core 2.0 web应用程序,在调试模式下工作得非常好,但是当我在测试服务器中部署到IIS时,我们尝试从客户端计算机执行时,遇到了一个问题:

An unhandled exception occurred while processing the request.
CryptographicException: The key {0851ad3b-df33-4cf7-8c3a-5c637adaa713} was not found in the key ring.
Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, bool allowOperationsOnRevokedKeys, out UnprotectStatus status)

InvalidOperationException: The antiforgery token could not be decrypted.
Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(string serializedToken)
当我打开登录页面时,问题开始出现。我在这里和其他博客中调查了存在相同问题的链接,但我发现必须使用ValidateAntiForgeryToken,解决方案与Microsoft.AspNetCore.DataProtection相关。我将nuget软件包Microsoft.AspNetCore.DataProtection.Redis添加到我的项目中,并在startup类的ConfigureServices中添加了以下代码:

    var redis = ConnectionMultiplexer.Connect("192.168.10.151:80");
    services.AddDataProtection().PersistKeysToRedis(redis, "DataProtection-Keys");
    services.AddOptions();
我们的测试服务器ip为192.168.10.151,但应用程序引发以下异常:

RedisConnectionException: It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. InternalFailure on PING
?既然在同一个web应用服务器上解析,为什么它无法连接? ?数据保护密钥数据库位于哪里

作为一种解决方法,我使用PersistKeyStoreFileSystem更改了方法,如下所示:

services.AddDataProtection()
                .SetApplicationName("myapp-portal")
                .PersistKeysToFileSystem(new System.IO.DirectoryInfo (@"c:\ProgramData\dpkeys"));
然而,当提交登录表单时,在测试服务器192.168.10.151中运行应用程序会返回到登录页面。正在检查标准输出日志文件,仅显示:

托管环境:生产 内容根路径:C:\inetpub\wwwroot\OmniPays 现在收听: 应用程序已启动。按Ctrl+C组合键关闭

通过chrome的开发者工具查看网络消息,我注意到:

请求URL: 申请方式:邮寄 状态代码:302已找到 远程地址:192.168.10.151:80 推荐人策略:降级时无推荐人

然后

请求URL: 请求方法:获取 状态代码:302已找到 远程地址:192.168.10.151:80 推荐人策略:降级时无推荐人

AccountController的登录操作仅在身份验证成功且主操作具有[Authorize]属性时才将请求重定向到HomeController的主操作。由于某些原因我无法理解,主操作失败并返回登录页面。chrome中的URL显示:

我正在使用Microsoft标识。在调试模式下工作正常,如果我在IIS上的本地PC上部署应用程序,也可以正常工作。?可能服务器中缺少任何SDK


请需要帮助

找到了解决方案!问题的原因不在IIS,也不在服务器上,到服务器的连接使用http而不是https,没有涉及验证安全连接的证书,但是在不同服务器上测试应用程序工作正常,所以我感到非常失望。解决方案是删除所有浏览器中指向开发服务器(失败)的任何与此URL相关的Cookie数据、以前存储的数据,瞧!!,现在这个应用程序运行得非常完美。默认情况下,由于bhmahler注释数据保护是在内存中进行的,我默认离开了配置,我的意思是,在redis中不显式地持久化,也不显式地持久化文件系统,并且工作正常,但是将DataProtection设置为强数据敏感保护很重要


我是这些话题的新手,真不敢相信这么简单的事情会浪费我的时间。谢谢大家

你的redis服务器真的在端口80上运行吗?我是新手,?redis服务器是另一个应用程序web服务器实现?redis是一个缓存服务器,类似于数据库,但通常所有符号都存储在内存中,除非你特别要求它保持。它的默认端口是6379。因此,使用Microsoft.AspNetCore.DataProtection?不是必须的,如果我不使用此库,默认情况下密钥在内存中管理?在这种情况下,为什么应用程序返回到登录页面,而[授权]似乎失败了?这实际上取决于您存储的内容。如果没有一个数据被认为是敏感的,那么我想你就不需要它了。这就是说,保护任何数据通常是一种良好的做法。您是否尝试过将redis连接的端口设置为6379,以查看默认端口是否可用?