繁体   English   中英

从 React Native 访问 ASP.NET Core 2.1 Web API 时“无法对 HTTPS 连接进行身份验证”

[英]'Failed to authenticate HTTPS connection' while accessing ASP.NET Core 2.1 Web API from React Native

我有一个 ASP.NET Core 2.1 Web API 项目,它提供来自 SQL Server 数据库的数据。 我在 Visual Studio 中创建 API 项目时选中了“配置 HTTPS”选项。

我需要从 React Native 项目访问这个 API,我尝试使用Fetch API。 当我向不同的 API 发出 REST 请求时,我使用的方法有效,但它不适用于我自己的 API 项目。 当我向 API 发出简单的 GET 请求时,我在移动设备上收到Network request failed错误,而在 API 端,遇到以下错误堆栈:

dbug: HttpsConnectionAdapter[1]
      Failed to authenticate HTTPS connection.
System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception. ---> System.ComponentModel.Win32Exception: An unknown error occurred while processing the certificate
   --- End of inner exception stack trace ---
   at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Security.SslState.ThrowIfExceptional()
   at System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult result)
   at System.Net.Security.SslStream.EndAuthenticateAsServer(IAsyncResult asyncResult)
   at System.Net.Security.SslStream.<>c.<AuthenticateAsServerAsync>b__51_1(IAsyncResult iar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Server.Kestrel.Https.Internal.HttpsConnectionAdapter.InnerOnConnectionAsync(ConnectionAdapterContext context)

但是,当我使用 Postman 进行请求时,请求工作正常,结果如下:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/api/values application/json
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[2]
      Successfully validated the token.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.1.1-rtm-30846 initialized 'DataContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (62ms) [Parameters=[@__get_Item_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
      SELECT TOP(1) [e].[id], [e].[pw], [e].[pws], [e].[em]
      FROM [ul] AS [e]
      WHERE [e].[id] = @__get_Item_0
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Route matched with {action = "Get", controller = "Values"}. Executing action Api.Controllers.ValuesController.Get (Api)
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
      Authorization was successful.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method Api.Controllers.ValuesController.Get (Api) - Validation state: Valid
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action method Api.Controllers.ValuesController.Get (Api), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.4905ms.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
      Executing ObjectResult, writing value of type 'System.String[]'.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action Api.Controllers.ValuesController.Get (Api) in 30.7297ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  Request finished in 125.3707ms 200 application/json; charset=utf-8

附加信息:

当我运行 API 项目时,会出现以下对话框:

您想信任 ASP.NET Core SSL 证书吗

单击“是”会导致:

访问控制列表 (ACL) 结构无效

这个错误的原因是什么,我应该如何解决这个问题?

根据此 MSDN 博客,您可以手动安装证书。

  1. 单击开始,然后单击运行,输入“mmc”并单击确定,打开一个空白的 Microsoft 管理控制台:
  2. 单击文件,然后单击添加/删除管理单元:
  3. 当显示添加或删除管理单元对话框时,单击证书,然后单击添加:
  4. 当显示证书管理单元对话框时,单击计算机帐户,然后单击下一步:
  5. 单击本地计算机,然后单击完成:
  6. 单击“确定”关闭“添加或删除管理单元”对话框:
  7. 在控制台根目录中,展开证书(本地计算机),然后展开个人,然后单击证书:
  8. 选择具有以下属性的证书:颁发给 = "localhost"、颁发者 = "localhost"、友好名称 = "IIS Express 开发证书"
  9. 单击操作,然后单击所有任务,然后单击导出:
  10. 当显示证书导出向导时,单击下一步:
  11. 单击否,不导出私钥,然后单击下一步:
  12. 单击 DER 编码的二进制 X.509 (.CER),然后单击下一步:
  13. 输入导出证书的路径,例如“c:\\users\\robert\\desktop\\iisexpress.cer”,然后点击下一步:
  14. 单击完成导出证书:
  15. 当证书导出向导显示一个对话框通知您导出成功时,单击确定:
  16. 在 Console Root 中,展开 Certificates (Local Computer),然后展开 Trusted Root Certification Authorities,然后单击 Certificates:
  17. 单击操作,然后单击所有任务,然后单击导入:
  18. 当显示证书导入向导时,单击下一步:
  19. 输入导出证书的路径,例如“c:\\users\\robert\\desktop\\iisexpress.cer”,然后单击下一步:
  20. 确保选中将所有证书放入以下存储区并验证所选证书存储区是否设置为受信任的根证书颁发机构,然后单击下一步:
  21. 单击完成以导入证书:
  22. 当证书导入向导显示一个对话框通知您导入成功时,单击确定:
  23. 您的 IIS Express 证书现在应该在受信任的根证书颁发机构列表中显示为“localhost”:

这是我的解决方案

dotnet dev-certs https
dotnet dev-certs https --trust

此解决方案解决了问题https://stackoverflow.com/a/59539907/8722913

dotnet dev-certs https --clean

dotnet dev-certs https --trust

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM