如何为外部系统实现基于API密钥的安全认证和授权?

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

我正在设计一个 API(dot net core API),该 API 将由需要访问特定端点的外部系统(主要是服务器)使用。例如,我的 API 有以下端点:

/users
/applications
/clients

我需要确保:

  • 外部系统A只能访问/users和/applications
  • 外部系统B只能访问/users和/clients

我想使用 API 密钥实现安全的身份验证和授权系统(想避免 OAuth)。

当前方法

  1. 使用 API 密钥进行身份验证
  • API 密钥生成:为每个外部系统生成并分配唯一的 API 密钥。
  • API 密钥存储:将 API 密钥以及关联的系统及其权限安全地存储在数据库中。
{
  "api_key": "api_key_A",
  "role": "SystemA_Role"
}
  1. 用于授权的基于角色的访问控制(RBAC) 根据每个外部系统的访问要求定义角色。 权限映射:将每个角色映射到允许其访问的特定端点。
{
  "roles": {
    "SystemA_Role": {
      "endpoints": [
        "/counterparties",
        "/assessments"
      ]
    },
    "SystemB_Role": {
      "endpoints": [
        "/counterparties",
        "/reports "
      ]
    }
  }
}

**问题:**

  • 这种方法是否符合行业标准,对于生产环境是否安全且可扩展?
  • 此外,是否可以使用 Azure 密钥保管库服务安全地存储这些密钥?
asp.net authentication .net-core architecture
1个回答
0
投票

这是我找到的关于 API 密钥的示例。正如您所看到的,它创建了一个中间件来验证 httpcontext 中包含的密钥。我们可以知道传入的 url,这是关键,这样我们就可以知道是否应该让请求继续。

这种方法是否符合行业标准、安全且可扩展? 生产环境。

这取决于,假设我们想要实现的应用程序/系统非常简单且稳定,那么我认为使用API密钥是很好的。但如果系统可能变得越来越复杂,那么恐怕这不是一个好的选择,因为密钥本身不包含任何额外的信息。与 JWT token 相比,token 本身包含了很多信息,可以用来验证很多其他信息。

store these keys securely using the Azure key vault service

当然可以,Azure Key Vault 为我们提供了一种存储密钥的新方法。我们需要做的是将身份验证添加到应用程序中,以便应用程序可以连接到 Azure 密钥保管库。例如,就像我上面分享的示例中的中间件一样,我们可以添加下面的代码来获取存储在Azure keyVault中的密钥。我们使用 DefaultAzureCredential 来通过身份验证。

const string secretName = "clientsecret";
var kvUri = "https://keyvaultname.vault.azure.net/";
var a = new DefaultAzureCredential();
var client = new SecretClient(new Uri(kvUri), a);
var secret = await client.GetSecretAsync(secretName);
string secretVaule = secret.Value.Value;

无论如何我更喜欢jwt授权。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.