情况如下:
- C# Windows 窗体应用程序
- ASP.NET 网络应用程序
- 两者都使用同一数据库中的自定义用户表(用户名/密码)进行身份验证,并创建一个在两个应用程序中都使用的用户对象
用户登录到 Windows 窗体应用程序,我们想要启动一个 URL 以在默认浏览器(IE、Chrome、Firefox 等)中打开 ASP.NET Web 应用程序中的页面。我们希望将当前用户名/密码从 Windows 窗体应用程序传递到 ASP.NET Web 应用程序,以使用户不必单独登录 Web 应用程序。
根据我们的研究,以下是我们发现的一些选项(以及缺点):
- 将 URL 中的用户名/密码作为 QueryStrings 传递,并在 Web 应用程序中创建用户对象
- 不安全(密码在 URL 中可见)
- 在客户端计算机上创建一个临时 HTML 页面,其中包含一个 JavaScript OnLoad 函数,该函数将用户名/密码 POST 到目标 URL 并在 Web 应用程序中创建 User 对象
- (找不到使用 C# 将数据直接发布到 URL 并在默认浏览器中显示 URL 的方法)
- 不安全(密码在临时页面中可见)
- 创建一个“Handoff”表来存储用户名/密码,其密钥通过 QueryString 传递到页面并在页面加载时从表中删除并在 Web 应用程序中创建用户对象
- 密钥被拦截的可能性很小(黑客)
- 有一个单独的 MongoDB 存储用户对象并在 Web 应用程序中检索它
- 运行单独的软件 (MongoDB) - 额外的故障点
所有这一切都是为了让用户不必输入他们的用户名/密码两次来登录这两个应用程序。
上述哪一个选项效果最好(最安全,开销/维护最少)?
或者
有没有办法在默认浏览器可以使用的 C# 应用程序中创建表单身份验证票证(cookie?)?
或者
有没有更好、更安全的方法来处理这个问题?
(编辑)
或者
如果用户已经通过 Windows 窗体应用程序进行了身份验证,要求用户再次输入用户名/密码以访问 Web 应用程序是否有充分的理由?如果是这样,你能提供参考链接吗?最佳实践、网络安全标准等。