安全访问外部 Web API .NET CORE

Posted

技术标签:

【中文标题】安全访问外部 Web API .NET CORE【英文标题】:secure access to external web API .NET CORE 【发布时间】:2021-06-09 14:51:35 【问题描述】:

我有两个在 .Net 核心中开发的 Web API 应用程序。我需要将 Json 数据从第二个应用程序导入到第一个应用程序。但是,我有一个安全问题。我需要保护对外部 API 的访问。我应该如何安全地管理这两个 API 之间的连接。 例如,我需要在下面的代码中保护对 URL 的访问 => 无需其他身份验证即可安全访问 covid API。

PS:我在两个应用程序中都使用 JWT 令牌身份验证

最好的问候。


    using (var client = new HttpClient())
    
      string url = string.Format("https://covid19.mathdro.id/api");
      var response = client.GetAsync(url).Result;
    
      string responseAsString = await response.Content.ReadAsStringAsync();
      result = JsonConvert.DeserializeObject<CovidResult>(responseAsString);
    

【问题讨论】:

“安全”是什么意思?您已经在使用 HTTPS,您还应该添加一些身份验证或令牌来证明谁在访问。你在找什么?你想防御什么? 另外,永远不要使用Task.Result,因为它会导致死锁。请改用await,就像您正在阅读结果字符串一样。 @Alejandro 感谢您的回复,我正在寻找验证 covid API 的外部使用。如何证明如何从​​第一个应用程序访问到第二个应用程序。第一个应用程序中的用户使用 jwt 进行身份验证。但是,如果我只允许第二个应用程序的经过身份验证的成员访问 covid API,则不允许第一个 API 的用户访问 因为你在服务器上拥有2个应用程序,所以这可以通过引入所谓的client idapp id来实现客户端密码应用令牌。所以这是一种用于验证应用程序(而不是用户)的凭据。这很像 Google、FB ......管理由开发人员创建的应用程序,这些应用程序使用他们提供的服务。 你有例子吗? 【参考方案1】:

如果两个 API 都受同一个 accessToken 保护,那么您可以从第一个请求中读取授权标头并将其传递给第二个请求。 像这样阅读标题:

var authHeader = context.Request.Headers.Get("Authorization");

你应该得到 authHeader 等于 "Bearer ey...(a bundle of base64)"

然后将auth头添加到客户端:

var request = new HttpRequestMessage() 
RequestUri = new Uri("http://https://covid19.mathdro.id/api"),
    Method = HttpMethod.Get,
;

...

request.Headers.Authorization.Add(new AuthenticationHeaderValue(authHeader));
var task = client.SendAsync(request)

【讨论】:

所以,我需要将相同的身份验证令牌添加到我的第一个 APP 的请求中,以证明访问外部 covid API 的真实性。? authHeader 变量的结果是什么? 在不了解您的配置的情况下很难确定您的需求。两个 api 是否都配置为使用带有 jwt 的 Oauth2?如果两者都受到相同令牌的保护,那么您可以将该令牌传递给下一个请求。如果这是您需要的,那么我的示例应该是可能的。请记住,这仅包含您的访问令牌,并且这些令牌过期。您的初始客户端可能会静默刷新您的访问令牌。如果请求得到快速处理,这可能不会成为问题,但如果您需要令牌运行很长时间,它可能会失败。 我的两个 API 都使用带有 jwt 的 Oauth2 但不是同一个令牌。 authHeader 是访问第二个 API 的令牌吗?以及如何生成它? 什么是提供身份验证?谷歌?天蓝色?等等?配置方法可能会有所不同。但通常,您的令牌实际上是 Authorization 标头中文本“Bearer”之后的部分。如果您有两个单独的“注册”,您需要允许第一个访问第二个的范围,那么您将能够使用相同的令牌。否则不行。 King Kong 的答案是你应该做的 IMO。只需使用应用程序凭据保护第二个 API,因为您拥有它。然后让 api 1 使用这些凭据登录到 api 2。我确定您有充分的理由使用 api 2,但是您可以将 api 2 执行的代码放入 api 1 中吗?

以上是关于安全访问外部 Web API .NET CORE的主要内容,如果未能解决你的问题,请参考以下文章

NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)

如何为 .NET Core Web API 进行安全身份验证?

ASP.Net Core Web API 中的安全用户操作

在 ASP.NET Core Web API 中访问和使用 UserClaims

Refit结合Polly访问ASP.NET Core Web API

ASP.NET Core认证原理和实现