访问API时,得到500内部服务器错误。从Identity Server4登录表单成功登录后,重定向到Anglar前端。

问题描述 投票:0回答:1

我使用Angular前端,.netcore API和identityserver4。我正在测试开发环境和生产环境下的AddSigningCredential(证书)。在我的本地环境下,从identityserver4登录成功后,从identityserver4登录重定向到字体端Angular,可以生成访问令牌,也可以访问API数据。

但在我的生产部署中,虽然可以使用AddSigningCredential(certificate)生成访问令牌,但在访问API时,却得到500个内部服务器错误。我是不是遗漏了什么,请指教。谢谢。

我在IIS中创建了Self-Signing Certificate,并将其与私钥导出,然后导入个人存储中。

在我的 identityserver4 Startup.cs 文件中搜索并将此证书作为参数传递给我进行部署。

 var config = new ConfigurationBuilder()
             .AddJsonFile("appsettings.json", optional: false)
             .Build();

            string identityServerUrl = config.GetSection("UrlSetting").GetValue<string>("IdentityServerUrl");
            string sslCertificateThumbprint = config.GetSection("UrlSetting").GetValue<string>("SSLCertificateThumbprint");
            string sslCertificateSerialNumber = config.GetSection("UrlSetting").GetValue<string>("SSLCertificateSerialNumber");
            if (Environment.IsDevelopment())
            {
                builder.AddDeveloperSigningCredential();
            }
            else
            {
                X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly);
                X509Certificate2Collection certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, sslCertificateThumbprint, false);
                if (certCollection.Count > 0)
                {
                    builder.AddSigningCredential(certCollection[0]);
                }
            }

我的访问令牌值和令牌信息。

access_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjkxRUYzODkwMkNBNDE0QTRBOThCMjNGNEZBM0VFRjZFMkJCNkE5NUMiLCJ0eXAiOiJhdCtqd3QiLCJ4NXQiOiJrZTg0a0N5a0ZLU3BpeVAwLWo3dmJpdTJxVncifQ.eyJuYmYiOjE1ODA4Nzg3OTQsImV4cCI6MTU4MDg4NTk5NCwiaXNzIjoiaHR0cHM6Ly8xMC4xLjE0MS4xNi9tYWNpZGVudGl0eSIsImF1ZCI6Im1hY2FwaSIsImNsaWVudF9pZCI6Im5nIiwic3ViIjoiNTk5Njk2M2EtZTA5Ni00MjE1LThjMzgtODA1Y2Y0OTZiOThlIiwiYXV0aF90aW1lIjoxNTgwODc4Nzk0LCJpZHAiOiJsb2NhbCIsIkFzcE5ldC5JZGVudGl0eS5TZWN1cml0eVN0YW1wIjoiSkFDWUtMSzZSMlhVUlQyTk1TUlVBSUlRNjdHT1dWQzUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbkBnbWFpbC5jb20iLCJuYW1lIjoiYWRtaW5AZ21haWwuY29tIiwiZW1haWwiOiJhZG1pbkBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInNjb3BlIjpbIm9wZW5pZCIsInByb2ZpbGUiLCJlbWFpbCIsIm1hY2FwaSJdLCJhbXIiOlsicHdkIl19.c-0sjA4k5kJZXTMhTgH_Mo0S5X9JVdCfk2D3FpK4aAQ7I4ej6p1pI1q-ybhyLYO_sNdMDhWpd6_xulpdRhnTOjQauhGjcno3h-Wanm8LHn6Nhl3m_0VqjBK96c5gEZRJI_qstCKFISL9YWMhPAEXc_YusDtq7vFZZGnx1zdD7sER3YHBuvpLreTRScOzWuhIEE4RTLipmyvyAqrvbAYWwQ5M_u8EjB2lvP5MnhHY9RAr1LqnjOeiKffGMe7RcUaoZDnQcCVT-38hYfZxS9ETcKYDTT_C-CXvOUyGV9EwGJSDbxqHvZcjZ4grPmVU5-lKK8QkQPHjgQagzWHRhhDknA&token_type=Bearer&expires_in=7200&scope=openid%20profile%20email%20testapi&state=8g8QZfc4rnJBoUeSvMEjU6DwY3dASb7Yp9uJGpOe&session_state=1trGZTtEqsh9pqPlPDNYFEIvDhilDrvibON6V11yGok.KJVy1w-xkxw9iRtT-bh9Ag'

API使用identityserver4保护,并使用angular-oauth2-oidc连接angular和身份服务器,授予类型是隐式的。

我在本地测试了AddDeveloeprSigningCredential()和AddSigningCredential(),当我用源码运行时,我认为工作正常,例如,如果我没有从前端Angular应用传递访问令牌值到后端api,我得到HttpResponseStatusCode 401,无法检索我的API数据。

如果我把访问令牌值从前端Angular传到后端api,我就可以检索我的API数据而不会收到任何错误。

在部署时,当我查看我的服务器端日志时。

2020-02-05 08:21:39 10.1.121.11 GET /webapi/api/student/availablestudent type=P1&nrcno=&filtertype=S 443 - 10.1.121.11 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/79.0.3945.130+Safari/537.36 https://10.1.121.11/TrainingManagementSystem/trainingmanagementsystem/person/search 500 0 0 49
identityserver4
1个回答
-1
投票

@Su Myat,你的代码帮了我很多,我能够让它工作。不过我还是把StoreLocation.CurrentUser改成了StoreLocation.LocalMachine,因为大多数时候,证书是以 "本地机 "而不是 "当前用户 "的形式导入的。

© www.soinside.com 2019 - 2024. All rights reserved.