1

情况如下:

  • 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 应用程序是否有充分的理由?如果是这样,你能提供参考链接吗?最佳实践、网络安全标准等。

4

2 回答 2

2

您可以将密码加盐+MD5 并简单地与 URL 一起发送。

但是,您应该首先指向服务器上的脚本,该脚本对用户进行身份验证并创建适当的 cookie,然后重定向到所需的页面,现在 URL 中没有凭据。

编辑:或者基本上做任何你想保留用户会话的事情

不幸的是,只要涉及密码,您就不可能 100% 安全。尽管如此,如果有人可以看到密码,散列加盐(加盐是在散列之前将密码与其他字符串连接时)密码可能是您最好的选择。

  1. 您使用盐生成密码哈希。
  2. 您将其发送以进行处理(我通常只是将其放入单独脚本的 URL 中,但这是一个偏好问题。)
  3. 您在服务器上生成具有相同盐的哈希,并与提交的哈希进行检查。
  4. 验证用户并重定向到原始位置。
于 2012-06-04T17:19:08.027 回答
1

除了 Máté Gelei 贡献的内容之外,您还可以在 Url 中包含一个时间戳,并检查以确保时间戳落在当前时间的几秒钟内。这是一点额外的保护,并确保登录尝试很快变得无效。当然,您可能希望以某种方式隐藏其目的以使其更加安全。

这并不能使其 100% 安全,但确实增加了一层保护。

于 2012-06-04T17:54:48.107 回答