WPF 身份验证,无需在代码中存储机密或证书信息

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

我有一个 WPF 应用程序,可以从 Azure 保管库收集机密。我已在 Azure 中创建了一个可以访问我的保管库的应用程序注册。为了获得保管库令牌,我需要将应用程序注册密钥存储在代码中或使用证书。即使我将秘密放在加密的配置文件中,有权访问我的应用程序 bin 文件夹的高级黑客也将能够解开这两种方法。

我尝试使用 Microsoft Entra ID 收集登录的用户信息,然后通过 Microsoft Graph 收集保管库令牌,但无法使其正常工作(不确定是否可行)。我不想向用户提供对保管库的访问权限。访问必须通过应用程序注册。还有其他方法吗?最安全的方法是什么?

wpf authentication azure-keyvault microsoft-entra-id azure-app-registration
1个回答
0
投票

欢迎来到该网站。对于软件架构论坛来说,这可能是一个更好的问题,但让我根据我在 WPF 和 Entra ID 身份验证方面的经验分享一些想法。

首先,您永远不能让客户端应用程序直接访问 Key Vault。句号。我讨厌说“永远”,并且经常批评别人这样做,但在这种情况下,它确实是“永远”。我们可以从数学/逻辑上证明,不存在安全客户端代码之类的东西。显然你已经有了这种倾向——所以拥抱它并遵循它。如果该密钥保管库中有某些内容可以保护 WPF 应用程序所需的资源,则您需要使用中间服务器(ASP.NET Core WebAPI 或您拥有的其他服务器)作为该资源的中间人。

一般来说,谈到身份验证,客户端应用程序拥有启动 Oauth 登录和访问 API 所需的应用程序注册“秘密”并非不可能,只要委派应用程序对 Azure 租户的唯一权限,而不是应用程序级别。这意味着人类用户必须通过 Oauth2 流程进行身份验证,并通过 Entra 登录页面提供凭据、MFA 等,然后接收不记名令牌以进行 Azure API 调用。

因此,即使“秘密”泄露,最坏的情况是攻击者利用它们来制作自己的应用程序来进行恶意 API 调用。他面临的问题是,他仍然需要用户凭据并通过 MFA,如果他们这样做了,他们可以直接进入 Azure 门户。

考虑 Azure 存储资源管理器 - 不是 WPF 应用程序,但它直接访问 Azure API。与 Azure Powershell 脚本相同。应用程序 ID 和应用程序机密被深埋在某个地方,很难找到,但它们就在那里。

综上所述,在生产环境中,很少有安全专业人员会允许除目录(用户配置文件信息等)信息之外的任何 Azure 资源通过防火墙并进入客户端应用程序。 Storage Explorer 和您所拥有的东西可以在开发中使用,或者在防火墙后面或由列入白名单的 IP 使用。因此,在实践中,WPF 应用程序可能被允许对租户执行的唯一操作是进行身份验证并获取用户配置文件信息。对于更多的事情,您将需要在应用程序和后端资源之间有一个中间服务器。

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