从桌面应用程序中打开网页,参数为用户名和密码

时间:2016-10-26 09:44:21

标签: c# asp.net

我开发了一个asp.net Web应用程序,用户可以通过提供用户名密码来访问和登录。现在我必须开发一个Windows窗体应用程序,用户也可以使用与我的Web应用程序相同的凭据登录。通过单击应用程序中的按钮,我希望它打开浏览器并将用户导航到Web应用程序并使用相同的凭据自动登录到我的Web应用程序。但我的问题是如何将凭据传递给我的网络应用程序?

我正在使用Process.Start(" http://localhost:8080/myAppLogin.aspx")来打开浏览器并加载我的登录页面。我可以使用加密格式传递查询字符串中的凭据,但这听起来并不像是一种安全的方法。我想用更安全的方法将凭据传递到我的网页。

有什么建议吗?

此问题编辑错误,并在其中丢失了一些有意义的信息。我已经重新编辑了下面的问题

修改

我开发了一个asp.net Web应用程序,用户可以通过提供用户名密码来访问和登录。现在我必须开发一个Windows窗体应用程序.Win Form应用程序在我的Win窗体应用程序的File.There&sa按钮中包含用户的Web应用程序凭据,我希望用户登录我的Web应用程序单击此按钮例如,通过单击Win Form应用程序中的按钮,我希望它打开浏览器并将用户导航到Web应用程序并自动登录到我的Web应用程序。但我的问题是如何将凭据传递给我的网络应用程序?

我正在使用Process.Start("http://localhost:8080/myAppLogin.aspx")打开浏览器并加载我的登录页面。我可以使用加密格式传递查询字符串中的凭据,但这听起来并不像是一种安全的方法。我想用一些更安全的方法将凭据传递给我的网页。

有什么建议吗?

注意:我的Win表单应用程序无法访问我的Web App数据库

2 个答案:

答案 0 :(得分:1)

解决方案1:假设你想推出自己的

好的,所以我假设WinForms应用程序和ASP.NET应用程序都可以访问您提到的可以从其中任何一个登录的相同数据库。

因此,在这种情况下创建一个包含以下字段的表AuthTokens:

的authToken 用户名

创建WinForms和ASP.NET应用程序都知道的预共享密钥。

在Winforms应用中,照常对用户进行身份验证。验证成功后:

  1. 使用共享密钥加密用户名==> userEncrypted
  2. 创建userEncrypted ==>的MD5哈希值的authToken
  3. 将记录添加到AuthTokens表:

    INSERT INTO AuthTokens(AuthToken,UserName)VALUES(authToken,userEncrypted)

    然后使用authToken作为标题或正文(您的选择)的一部分调用POST“http://localhost:8080/autoLogin”,并使用PostRedirectGet pattern将请求发送到WebForms应用程序。

    然后在WebForms应用程序中:

    1. 从POST中检索authToken
    2. 在AuthTokens表中找到authToken
    3. 使用共享密钥==>解密表中的UserName字段unencryptedUserName
    4. 使用unencryptedUserName在
    5. 中记录用户
    6. 成功/失败后,重定向到您选择的GET页面。考虑所有条件 - 未找到令牌,解密用户的MD5与authToken等不匹配等
    7. 注意:

      • 执行POST意味着没有查询字符串和传递“容易看见”的东西。嗅探您的流量的人仍然可以看到它
      • 你从来没有存储任何未加密的东西 - 永远
      • 你从来没有通过可逆的电线发送任何东西 - 永远
      • 您只发送一个MD5哈希,因为这是不可逆的
      • 您仍需要一个共享密钥(PSK),这很痛苦。如果安全,您可以将其存储在数据库中

      无论你做什么,都要确保在实施过程中要小心,因为很容易弄错。

      扩展:

      • 您可以查看可避免PSK的公钥/私钥加密
      • 您的通讯应该是HTTPS而不是HTTP
      • 你可以在认证令牌到期时变得聪明 - 一次使用,时间到期等等。

      解决方案2 - 使用OAuth专为您描述的方案设计。

      解决方案2.1 - 实施您自己的身份验证服务

      例如https://github.com/IdentityServer/IdentityServer3,但还有其他人。

      解决方案3 - 查找将为您进行单点登录和用户管理的SaaS解决方案

      Google将成为您的朋友,因为我不会在不违反SO政策的情况下推荐任何内容。

答案 1 :(得分:-1)

TheEdge解决方案适合我。我在我的场景中实现了如下解决方案

Step1 我在Web App数据库的Users表中添加了两列,(i)AuthToken(ii)AuthDateTime。

Step2:我在我的网络应用程序中托管了一个可以接受并返回字符串的Web服务

第3步:我的Windows窗体应用程序将用户名密码字符串加密为字符串,并发送到我的Web应用程序中托管的Web服务。

Step4:我的网络服务收到字符串并将其解密为UserName和Password字符串并验证用户。

步骤5:成功验证后,我创建一个哈希码值(Auth Token)和一个当前的DateTime对象,并将其插入到该用户的用户表中。并将此AuthToken HashCode返回到我的Windows窗体应用程序。

Step6:我的表单应用程序收到AuthToken,并将此Token + UserName发送到我的Web应用程序的查询字符串中。

Step7:我的Web应用程序在查询字符串中收到用户名和令牌,并根据令牌值验证用户名,并在Auth Datetime的范围内,成功验证后,让用户登录到应用程序,并通过将AuthToken和AuthDateTime值设置为对该用户为null来更新用户表。