首页 文章

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

提问于
浏览
1

情况如下:

  • 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对象

  • (无法找到将数据直接POST到URL并使用C#在默认浏览器中显示URL的方法)

  • 不安全(密码在临时页面中可见)

  • 创建一个"Handoff"表来存储用户名/密码,其中一个密钥通过QueryString传递给页面,并在页面加载时从表中删除,并在Web应用程序中创建User对象

  • 被截获密钥的可能性很小(黑客)

  • 有一个单独的MongoDB,用于存储User对象并在Web应用程序中检索它

  • 运行单独的软件(MongoDB) - 附加故障点

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

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

OR

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

OR

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

(编辑)

OR

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

2 回答

  • 1

    您可以将MD5加密,并使用URL简单地发送密码 .

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

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

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

    • 使用salt生成密码哈希 .

    • 您发送它进行处理(我通常只是将它放入单独脚本的URL中,但这是一个偏好问题 . )

    • 您在服务器上生成具有相同salt的哈希,并根据提交的哈希进行检查 .

    • 验证用户并重定向到原始位置 .

  • 2

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

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

相关问题