在 Web 环境中转发凭据的好方法是什么?
What is a good way of forwarding credentials within a web environment?
给定以下配置:
- Web 客户端 = 常规的现代浏览器;
- 一个典型的ASP.NET网络应用程序,在互联网上的某个地方;
- 一个 third-party 网络服务:
- 位于另一个域中(通过 federation、domain trust relations 左右没有关系);
- 无法触摸/配置;
- 可通过互联网访问;
- 是connection-less;
- 要求对每个 Web 请求进行身份验证;
- 支持通用身份验证方案 (Windows) 并提供 SDK 允许在准备请求时设置凭据(用户名、密码)。
- 不支持 OAuth 或类似技术,因此没有可用于代替凭据的身份令牌。
ASP.NET 网络应用程序 将通过向 third-party 网络服务发出请求来实现其大部分功能.因此,Web 应用程序需要其用户的 Windows 凭据。
ASP.NET web 应用程序 将作为第 3 方 web 服务的 UI 代理 .此外,第 3 方 Web 服务不是单例。 Web 应用程序应该是那些第 3 方 Web 服务的许多实例的 UI 代理 (这么多 Windows 域)。因此,Web 应用程序的行为类似于 de-multiplexing UI 代理 - 如果有这样的术语 :) 它代理了第 3 方 Web 服务的多个实例。
现在我正在绞尽脑汁寻找一种安全的方式,通过 Web 应用程序将用户的凭据(用户名、密码)从 Web 客户端传递到 third-party 服务:)
在用户提供凭据后,在工作 session 开始,直到工作 session 结束,凭据可以安全地 保存 在哪里?我想到了各种媒体,例如:HTTP cookies、HTTP headers、HTML 本地存储、服务器内存、网络 session、应用程序数据库。
关于上面的问题,什么是加密凭据的好方法,以便在需要时可以解密它们,也就是说,在准备 third-party 网络服务请求时(对称加密) ?所有通信都是 HTTPS.
我知道这是一个奇怪的谜题:)
更新
也许让第 3 方 Web 服务支持代理身份验证模式(然后使用 OAuth 或类似的东西)会是最好的。对吧?
更新:类似(或重复?)问题 - 似乎是一个热门问题
i *must* store third party credentials in my database. best way?
How to store user password for third party service in Python?
Security model: log in to third-party site with user's credentials
Storing third-party passwords for reuse across pages
What is the best way to store password in database when API call requires sending of password in plain text?
Encrypting 3rd party credentials
What's a smart way of storing user credentials for an external site (that does not use OAuth)?
Need to ephemerally store third-party password
Storing third-party auth info securely
Reversible password storage obfuscation method for third-party login credentials
storing the third party credentials in the database/some secure place
在这种奇怪的情况下没有最好的方法,唯一的方法是将用户名和密码存储在应用程序会话中。这样至少您可以确保密码不会泄露给外部世界,并且在用户注销时也会自动删除。有权访问生产系统的人可以配置服务器并读取密码。您可能需要应用双向加密 (AES) 以使生产支持人员难以阅读它。
你已经提到第三方系统不能被触及,我不确定你是否可以建议对凭据传递的方式进行一些小的改进。试试这个。
- 第三方接受由 ssh 密钥(public 密钥)加密的凭据。
- 您可以在用户提交给您后立即通过 public 密钥加密凭据并将其保存在会话中。
在这种情况下,您身边没有人可以解密,但第三方可以使用私钥解密。不过,您和第三方需要一次性交换 ssh 密钥。
鉴于您拥有许多此类第 3 方服务 (see comment),它们都位于客户的域中,您的 Web 应用程序(位于这些域之外)不应直接与第 3 方服务通信。
您的应用程序会成为黑客攻击的目标,因为它以明文方式处理用户的域凭据。
我认为可能有效的唯一解决方案是让用户的浏览器与第 3 方服务通信以使用集成 Windows 身份验证 (IWA) 检索数据,然后 post此数据到您的 Web 应用程序。
您将必须配置跨源资源共享(CORS) on the 3rd party application for that to work (or use another way to circumvent the same-origin policy)
给定以下配置:
- Web 客户端 = 常规的现代浏览器;
- 一个典型的ASP.NET网络应用程序,在互联网上的某个地方;
- 一个 third-party 网络服务:
- 位于另一个域中(通过 federation、domain trust relations 左右没有关系);
- 无法触摸/配置;
- 可通过互联网访问;
- 是connection-less;
- 要求对每个 Web 请求进行身份验证;
- 支持通用身份验证方案 (Windows) 并提供 SDK 允许在准备请求时设置凭据(用户名、密码)。
- 不支持 OAuth 或类似技术,因此没有可用于代替凭据的身份令牌。
ASP.NET 网络应用程序 将通过向 third-party 网络服务发出请求来实现其大部分功能.因此,Web 应用程序需要其用户的 Windows 凭据。
ASP.NET web 应用程序 将作为第 3 方 web 服务的 UI 代理 .此外,第 3 方 Web 服务不是单例。 Web 应用程序应该是那些第 3 方 Web 服务的许多实例的 UI 代理 (这么多 Windows 域)。因此,Web 应用程序的行为类似于 de-multiplexing UI 代理 - 如果有这样的术语 :) 它代理了第 3 方 Web 服务的多个实例。
现在我正在绞尽脑汁寻找一种安全的方式,通过 Web 应用程序将用户的凭据(用户名、密码)从 Web 客户端传递到 third-party 服务:)
在用户提供凭据后,在工作 session 开始,直到工作 session 结束,凭据可以安全地 保存 在哪里?我想到了各种媒体,例如:HTTP cookies、HTTP headers、HTML 本地存储、服务器内存、网络 session、应用程序数据库。
关于上面的问题,什么是加密凭据的好方法,以便在需要时可以解密它们,也就是说,在准备 third-party 网络服务请求时(对称加密) ?所有通信都是 HTTPS.
我知道这是一个奇怪的谜题:)
更新
也许让第 3 方 Web 服务支持代理身份验证模式(然后使用 OAuth 或类似的东西)会是最好的。对吧?
更新:类似(或重复?)问题 - 似乎是一个热门问题
i *must* store third party credentials in my database. best way?
How to store user password for third party service in Python?
Security model: log in to third-party site with user's credentials
Storing third-party passwords for reuse across pages
What is the best way to store password in database when API call requires sending of password in plain text?
Encrypting 3rd party credentials
What's a smart way of storing user credentials for an external site (that does not use OAuth)?
Need to ephemerally store third-party password
Storing third-party auth info securely
Reversible password storage obfuscation method for third-party login credentials
storing the third party credentials in the database/some secure place
在这种奇怪的情况下没有最好的方法,唯一的方法是将用户名和密码存储在应用程序会话中。这样至少您可以确保密码不会泄露给外部世界,并且在用户注销时也会自动删除。有权访问生产系统的人可以配置服务器并读取密码。您可能需要应用双向加密 (AES) 以使生产支持人员难以阅读它。
你已经提到第三方系统不能被触及,我不确定你是否可以建议对凭据传递的方式进行一些小的改进。试试这个。
- 第三方接受由 ssh 密钥(public 密钥)加密的凭据。
- 您可以在用户提交给您后立即通过 public 密钥加密凭据并将其保存在会话中。
在这种情况下,您身边没有人可以解密,但第三方可以使用私钥解密。不过,您和第三方需要一次性交换 ssh 密钥。
鉴于您拥有许多此类第 3 方服务 (see comment),它们都位于客户的域中,您的 Web 应用程序(位于这些域之外)不应直接与第 3 方服务通信。
您的应用程序会成为黑客攻击的目标,因为它以明文方式处理用户的域凭据。
我认为可能有效的唯一解决方案是让用户的浏览器与第 3 方服务通信以使用集成 Windows 身份验证 (IWA) 检索数据,然后 post此数据到您的 Web 应用程序。
您将必须配置跨源资源共享(CORS) on the 3rd party application for that to work (or use another way to circumvent the same-origin policy)