将用户名/密码从Windows窗体应用程序传递到ASP.NET Web应用程序

时间:2012-06-04 17:09:40

标签: c# asp.net winforms security

情况如下:

  • C#Windows窗体应用程序
  • ASP.NET Web应用程序
  • 使用同一数据库中的自定义用户表进行身份验证(usename / password)并创建在两个应用程序中使用的User对象

用户登录Windows窗体应用程序,我们想要启动URL以在默认浏览器(IE,Chrome,Firefox等)中打开ASP.NET Web应用程序中的页面。我们希望将当前用户名/密码从Windows窗体应用程序传递到ASP.NET Web应用程序,以防止用户单独登录Web应用程序。

根据我们的研究,我们发现了一些选项(以及缺点):

  • 将URL中的用户名/密码作为QueryStrings传递,并在Web应用程序中创建User对象
    • 不安全(密码在URL中可见)
  • 在客户端计算机上创建一个临时HTML页面,其中包含一个JavaScript OnLoad函数,该函数将用户名/密码POST到目标URL并在Web应用程序中创建User对象
    • (无法找到将数据直接发布到网址并使用C#在默认浏览器中显示网址的方法)
    • 不安全(密码在临时页面中可见)
  • 创建一个“切换”表,用于存储用户名/密码,该密钥通过QueryString传递给页面,并在页面加载时从表中删除,并在Web应用程序中创建User对象
    • 被截获密钥的可能性很小(黑客)
  • 拥有一个单独的MongoDB,用于存储User对象并在Web应用程序中检索它
    • 运行单独的软件(MongoDB) - 附加故障点

所有这一切都是为了让用户不必两次输入用户名/密码来登录这两个应用程序。

上述哪个选项最适合(最安全,最少开销/维护)?

有没有办法在C#应用程序中创建可以由默认浏览器使用的表单身份验证票证(cookie?)?

有没有更好,更安全的方法来处理这个?

(编辑)

如果用户已经通过Windows窗体应用程序进行了身份验证,是否有理由要求用户再次输入用户名/密码来访问Web应用程序?如果是这样,你能提供参考链接吗?最佳实践,网络安全标准等。

2 个答案:

答案 0 :(得分:2)

你可以加密+ MD5密码,只需用URL发送即可。

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

编辑:或基本上做任何你想保留用户会话的内容

不幸的是,只要涉及密码,您就无法100%安全。尽管如此,如果有人可以获得密码的视觉效果,那么散列salted (salting is when you concatenate the password with some other string before hashing)密码可能是您最好的选择。

  1. 使用salt生成密码哈希。
  2. 你发送它进行处理(我通常只是把它放在一个单独的脚本的URL中,但这是一个偏好的问题。)
  3. 您在服务器上生成具有相同salt的哈希,并根据提交的哈希值进行检查。
  4. 对用户进行身份验证并重定向到原始位置。

答案 1 :(得分:1)

除了MátéGelei所做的贡献之外,您还可以在Url中添加时间戳,并检查以确保时间戳在当前时间的几秒内。这是一个小小的附加保护,可确保登录尝试很快失效。当然,您可能希望以某种方式隐藏此目的,以使其更安全。

这不会使其100%安全,但它确实增加了一个级别的保护。