起因
最近做了一个小项目,公司的信息管理系统,用了一个刚学习的模式来做,IdentityServer4+API+Blazor
开发调试过程中很顺利,三天搞定了,但是在部署过程中,却遇到了很多问题,又弄了大概三天,血一样的教训,记录一下
问题
网站部署的环境搭建就不详细说了
在网站登录时,报错No ‘Access-Control-Allow-Origin’ header
Access to XMLHttpRequest at ‘http://192.168.20.6:5601/.well-known/openid-configuration‘ from origin ‘http://192.168.20.6:5603‘ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
报了一个跨域问题
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
后面我就按照网上的说法,写了各种跨域的设置,但是还是报错
突破
由于是一个小项目,就没有写日志记录,后面迫不得已还是加一个日志记录,再部署到IIS中
于是终于在日志中发现了一个报错:找不到对象(在一堆英文中发现的)
首先是报Host terminated unexpectedly.(主机意外终止),下面才报找不到对象
仔细研究日志,发现是中Startup的 builder.AddDeveloperSigningCredential();中报错
Host terminated unexpectedly.
Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: 找不到对象。
at System.Security.Cryptography.CngKeyLite.GenerateNewExportableKey(String algorithm, Int32 keySize)
at System.Security.Cryptography.RSAImplementation.RSACng.GetDuplicatedKeyHandle()
at System.Security.Cryptography.RSAImplementation.RSACng.ExportKeyBlob(Boolean includePrivateParameters)
at System.Security.Cryptography.RSAImplementation.RSACng.ExportParameters(Boolean includePrivateParameters)
at Microsoft.IdentityModel.Tokens.JsonWebKeyConverter.ConvertFromRSASecurityKey(RsaSecurityKey key)
at Microsoft.Extensions.DependencyInjection.IdentityServerBuilderExtensionsCrypto.AddDeveloperSigningCredential(IIdentityServerBuilder builder, Boolean persistKey, String filename, RsaSigningAlgorithm signingAlgorithm)
at Dartmon.MIS.Ids.Startup.ConfigureServices(IServiceCollection services) in E:\xxx\Startup.cs:line 86
AddDeveloperSigningCredential这个方法是设置临时的签名凭证,在项目首次启动时,会自动创建一个开发人员签名密钥,文件为tempkey.jwk,如果文件不存在,则会重新创建
解决
于是,我尝试着把tempkey.jwk文件放到服务器上,放到部署目录,重新启动网站
于是….终于可以了
太激动了…弄了三天…就因为缺失一个文件
三天的部署,也不完全是缺失文件的问题,也有IIS环境的问题,Blazor部署的问题,后面计划写篇关于Blazor部署问题的文章
最终解决方案
最后说下解决方案,在部署的时候不能总靠复制tempkey.jwk文件,万一哪天忘了,就不得了了
看看这文件的属性
复制到输出目录,原来的设置是不复制,改为始终复制或如果较新则复制即可,这样每次发布时,文件就会自动复制到发布文件夹
完成WC…