大多数 Dapr 的 Azure 组件支持使用 Microsoft Entra ID 进行身份验证。通过这种方式:
Microsoft Entra ID 是 Azure 的身份和访问管理 (IAM) 解决方案,用于对用户和服务进行身份验证和授权。
Microsoft Entra ID 基于 OAuth 2.0 等开放标准,允许服务(应用程序)获取访问令牌以请求 Azure 服务,包括 Azure 存储、Azure 服务总线、Azure 密钥保管库、Azure Cosmos DB、Azure PostgreSQL 数据库、Azure SQL 等。
在 Azure 术语中,应用程序也被称为“服务主体”。
一些 Azure 组件提供其他身份验证方法,例如基于“共享密钥”或“访问令牌”的系统。尽管这些方法在 Dapr 中是有效且受支持的,但建议尽可能使用 Microsoft Entra ID 对 Dapr 组件进行身份验证,以利用其众多优势,包括:
使用托管身份 (MI),您的应用程序可以通过 Microsoft Entra ID 进行身份验证并获取访问令牌以请求 Azure 服务。当您的应用程序在支持的 Azure 服务(如 Azure 虚拟机、Azure 容器应用、Azure Web 应用等)上运行时,可以在基础设施级别为您的应用程序分配一个身份。
使用 MI 后,您的代码无需处理凭据,这样可以:
在 Azure Kubernetes 服务上运行的应用程序可以类似地利用 工作负载身份 自动为单个 pod 提供身份。
使用支持服务的 Azure 基于角色的访问控制 (RBAC) 时,可以对应用程序授予的权限进行精细调整。例如,您可以限制对数据子集的访问或将访问权限设为只读。
使用 Microsoft Entra ID 提供了改进的访问审计体验。租户的管理员可以查阅审计日志以跟踪身份验证请求。
虽然 Microsoft Entra ID 允许您使用 MI,但您仍然可以选择使用证书进行身份验证。
默认情况下,Dapr 组件配置为与“公共云”中的 Azure 资源交互。如果您的应用程序部署到其他云(如 Azure 中国或 Azure 政府“主权云”),您可以通过将 azureEnvironment
元数据属性设置为以下支持的值之一来启用该功能:
"AzurePublicCloud"
"AzureChinaCloud"
"AzureUSGovernmentCloud"
对主权云的支持是实验性的。
要使用 Microsoft Entra ID 进行身份验证,您需要将以下凭据作为值添加到您的 Dapr 组件 的元数据中。
根据您向 Dapr 服务传递凭据的方式,您有多种元数据选项。
字段 | 必需 | 详情 | 示例 |
---|---|---|---|
azureTenantId | Y | Microsoft Entra ID 租户的 ID | "cd4b2887-304c-47e1-b4d5-65447fdd542b" |
azureClientId | Y | 客户端 ID(应用程序 ID) | "c7dd251f-811f-4ba2-a905-acd4d3f8f08b" |
azureClientSecret | Y | 客户端密钥(应用程序密码) | "Ecy3XG7zVZK3/vl/a2NSB+a1zXLa8RnMum/IgD0E" |
在 Kubernetes 上运行时,您还可以使用对 Kubernetes secret 的引用来获取上述任何或所有值。
字段 | 必需 | 详情 | 示例 |
---|---|---|---|
azureTenantId | Y | Microsoft Entra ID 租户的 ID | "cd4b2887-304c-47e1-b4d5-65447fdd542b" |
azureClientId | Y | 客户端 ID(应用程序 ID) | "c7dd251f-811f-4ba2-a905-acd4d3f8f08b" |
azureCertificate | azureCertificate 和 azureCertificateFile 之一 | 证书和私钥(PFX/PKCS#12 格式) | "-----BEGIN PRIVATE KEY-----\n MIIEvgI... \n -----END PRIVATE KEY----- \n -----BEGIN CERTIFICATE----- \n MIICoTC... \n -----END CERTIFICATE----- |
azureCertificateFile | azureCertificate 和 azureCertificateFile 之一 | 包含证书和私钥的 PFX/PKCS#12 文件的路径 | "/path/to/file.pem" |
azureCertificatePassword | N | 如果加密,证书的密码 | "password" |
在 Kubernetes 上运行时,您还可以使用对 Kubernetes secret 的引用来获取上述任何或所有值。
字段 | 必需 | 详情 | 示例 |
---|---|---|---|
azureClientId | N | 客户端 ID(应用程序 ID) | "c7dd251f-811f-4ba2-a905-acd4d3f8f08b" |
使用托管身份,通常推荐使用 azureClientId
字段。使用系统分配的身份时该字段是可选的,但使用用户分配的身份时可能是必需的。
在 Azure Kubernetes 服务 (AKS) 上运行时,您可以使用工作负载身份对组件进行身份验证。请参阅 Azure AKS 文档以了解如何为您的 Kubernetes 资源 启用工作负载身份。
重要提示: 此身份验证方法仅推荐用于 开发。
此身份验证方法在本地机器上开发时可能很有用。您将需要:
az login
命令成功进行身份验证当 Dapr 在主机上运行时,如果 Azure CLI 有可用的凭据,组件可以自动使用这些凭据进行身份验证,而无需配置其他身份验证方法。
使用此身份验证方法不需要设置任何元数据选项。
在此示例中,您将设置一个使用 Microsoft Entra ID 进行身份验证的 Azure 密钥保管库 secret 存储组件。
要使用 客户端密钥,请在组件目录中创建一个名为 azurekeyvault.yaml
的文件,并填写上述设置过程中的详细信息:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: azurekeyvault
namespace: default
spec:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "[your_keyvault_name]"
- name: azureTenantId
value: "[your_tenant_id]"
- name: azureClientId
value: "[your_client_id]"
- name: azureClientSecret
value : "[your_client_secret]"
如果您想使用保存在本地磁盘上的 证书,请改用:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: azurekeyvault
namespace: default
spec:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "[your_keyvault_name]"
- name: azureTenantId
value: "[your_tenant_id]"
- name: azureClientId
value: "[your_client_id]"
- name: azureCertificateFile
value : "[pfx_certificate_file_fully_qualified_local_path]"
在 Kubernetes 中,您将客户端密钥或证书存储到 Kubernetes Secret Store 中,然后在 YAML 文件中引用它们。
要使用 客户端密钥:
使用以下命令创建一个 Kubernetes secret:
kubectl create secret generic [your_k8s_secret_name] --from-literal=[your_k8s_secret_key]=[your_client_secret]
[your_client_secret]
是上面生成的应用程序客户端密钥[your_k8s_secret_name]
是 Kubernetes secret store 中的 secret 名称[your_k8s_secret_key]
是 Kubernetes secret store 中的 secret 键创建一个 azurekeyvault.yaml
组件文件。
组件 yaml 使用 auth
属性引用 Kubernetes secretstore,并且 secretKeyRef
引用存储在 Kubernetes secret store 中的客户端密钥。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: azurekeyvault
namespace: default
spec:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "[your_keyvault_name]"
- name: azureTenantId
value: "[your_tenant_id]"
- name: azureClientId
value: "[your_client_id]"
- name: azureClientSecret
secretKeyRef:
name: "[your_k8s_secret_name]"
key: "[your_k8s_secret_key]"
auth:
secretStore: kubernetes
应用 azurekeyvault.yaml
组件:
kubectl apply -f azurekeyvault.yaml
要使用 证书:
使用以下命令创建一个 Kubernetes secret:
kubectl create secret generic [your_k8s_secret_name] --from-file=[your_k8s_secret_key]=[pfx_certificate_file_fully_qualified_local_path]
[pfx_certificate_file_fully_qualified_local_path]
是您之前获取的 PFX 文件的路径[your_k8s_secret_name]
是 Kubernetes secret store 中的 secret 名称[your_k8s_secret_key]
是 Kubernetes secret store 中的 secret 键创建一个 azurekeyvault.yaml
组件文件。
组件 yaml 使用 auth
属性引用 Kubernetes secretstore,并且 secretKeyRef
引用存储在 Kubernetes secret store 中的证书。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: azurekeyvault
namespace: default
spec:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "[your_keyvault_name]"
- name: azureTenantId
value: "[your_tenant_id]"
- name: azureClientId
value: "[your_client_id]"
- name: azureCertificate
secretKeyRef:
name: "[your_k8s_secret_name]"
key: "[your_k8s_secret_key]"
auth:
secretStore: kubernetes
应用 azurekeyvault.yaml
组件:
kubectl apply -f azurekeyvault.yaml