在Web环境中转发凭据的好方法是什么?

时间:2015-01-17 16:46:03

标签: asp.net web-services security authentication encryption

给出以下配置:

  • 一个网络客户端=一个普通的现代浏览器;
  • 典型的 ASP.NET Web应用程序,位于Internet上的某个位置;
  • 第三方网络服务:
    • 位于另一个域(通过联盟无关系,域信任关系左右);
    • 无法触摸/配置;
    • 可通过互联网访问;
    • 是无连接的;
    • 要求对每个Web请求进行身份验证;
    • 支持通用身份验证方案(Windows)并提供 SDK ,允许在准备请求时设置凭据(用户名,密码)。
    • 不支持 OAuth 或类似技术,因此无法使用身份令牌代替凭据。

ASP.NET Web应用程序将通过向第三方Web服务发出请求来实现其大部分功能。因此,Web应用程序需要其用户的 Windows凭据

ASP.NET Web应用程序将像第三方Web服务的 UI代理。此外,第三方Web服务不是单身。对于那些第三方Web服务(许多Windows域)的许多实例,Web应用程序应该是 UI代理。因此,Web应用程序就像解复用UI代理 - 如果有这样的术语:)它代理第三方Web服务的多个实例。

现在,我正在努力寻找一种安全的方法,通过网络应用程序将用户的凭据(用户名,密码)从Web客户端传递到第三方服务:)

在用户提供凭据后,在工作会话开始时,凭据保持的位置,直到工作会话结束?我使用各种媒体,例如: HTTP Cookie,HTTP标头,HTML本地存储,服务器内存,网络会话,应用程序数据库

关于上述问题,加密凭据的好方法是什么,以便在需要时可以解密,也就是说,在准备第三方Web服务请求时(对称加密)?所有通信都是 HTTPS

我知道这是一个奇怪的谜题:)

更新

也许让第三方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

2 个答案:

答案 0 :(得分:1)

鉴于您拥有许多第三方服务(see comment),所有这些服务都存在于客户的域中,您的网络应用程序(居住在这些域之外)不应直接与第三方服务通信。

您的应用程序将成为黑客攻击的目标,因为它会以明文形式处理用户的域凭据。

我认为唯一可行的解​​决方案是让用户的浏览器与第三方服务通信,以使用集成Windows身份验证(IWA)检索数据,然后将此数据发布到您的Web应用程序。

您必须在第三方应用程序上配置跨源资源共享(CORS)才能使用(或使用其他方式circumvent the same-origin policy

答案 1 :(得分:0)

在这种奇怪的场景中没有最好的方法,但唯一的方法是在应用程序会话中存储用户名和密码。这样至少可以确保密码不会泄露给外部世界,也可以在用户退出时自动删除。有权访问生产系统的人可以配置服务器和读取密码。您可能需要应用双向加密(AES),以使生产支持人员难以阅读它。

您已经提到第三方系统无法触及,我不确定您是否可以对凭证通过的方式提出一些细微的改进。试试这个。

  1. 第三方接受由ssh密钥(公钥)加密的凭据。
  2. 您可以在用户提交给您并保持会话时通过公钥加密凭据。
  3. 在这种情况下,您身边的任何人都无法解密,但第三方可以使用私钥解密。您和第三方需要交换ssh密钥作为一次性设置。