【问题标题】:Implementing authentication in an webpage through WinForms app通过 WinForms 应用在网页中实现身份验证
【发布时间】:2009-07-24 21:45:19
【问题描述】:

情况来了……

一位客户安装了我的 super dooper winforms 应用程序。 用户名和密码在应用程序启动时通过我的 MSSQL 服务器进行身份验证。

我想在我的网页中重定向用户并让他在我的应用程序中单击“更新订阅”按钮时“登录”(无需强制他在网页中输入用户名和密码)。

欢迎任何想法或缺点

【问题讨论】:

  • 这个 -1 是从哪里来的?没用或不清楚?请记住,新手是存在的,并不是每个人都以英语为母语

标签: asp.net algorithm authentication login client-server


【解决方案1】:

我建议对您的架构稍作改动。

不要直接从 WinForms 应用程序对数据库进行身份验证,而是创建一个简单的 Web 服务,允许您传入用户名和密码,并在成功登录后接收身份验证令牌作为响应。或许可以把它做成某种用户名+密码的哈希值。

将此逻辑放入您的网站意味着令牌生成/身份验证全部包含在您的网站代码中,您可以在一处更改它,而不必确保 WinForms 部分和网站部分同步。

无论如何,WinForms 应用程序可以将令牌保存在内存中,并在查询字符串 (http://www.example.com/?token=08A78B2101EB4a09B2ACE8AF6D6BA993) 中将其传递回网站。然后,您可以使用哈希查找用户,并以这种方式记录他们:

select user_id from users where md5(concat(username, password)) = 'TOKEN_HERE'

或者,您可以通过 Web 服务(可能使用 GUID)在每次身份验证时生成唯一的哈希,并将其存储在某个表中以将其映射回用户 ID,并带有时间戳以允许您在之后过期一定的时间。

【讨论】:

    【解决方案2】:

    如果您正在为用户打开浏览器,并且将通过 HTTPS 请求该页面,那么最简单的方法是在初始请求中添加一个基本授权标头,然后让您的页面退出。

    在 C# 中,提取名称/密码的代码如下:

            string authHeader = application.Request.Headers["Authorization"];
            if (authHeader.ToUpper().Contains("BASIC"))
            {
                //get the user's name/password
                string decodedResponseString = Encoding.Default.GetString(Convert.FromBase64String(authHeader.Substring(6)));
                int dividerIndex = decodedResponseString.IndexOf(':');
                userName = decodedResponseString.Substring(0, dividerIndex);
                password = decodedResponseString.Substring(dividerIndex + 1);
    

    在桌面应用程序中创建标头与上述相同,但相反(即 addheader('authorization', 'basic (username:password encrypted in base 64)')。

    像这样使用标头是执行此操作的标准方法,但实际上您可能只需使用自定义登录算法信息制作自己的标头(或 cookie)

    编辑: 实际上这可能行不通;我不确定您是否对浏览器有足够的控制权来在请求页面时更改标题

    【讨论】:

      【解决方案3】:

      您是否正在存储用户的会话?这就是您保持用户登录状态直到会话到期(超时、用户注销等)的方式。

      我假设用户登录到应用程序,然后更新他们的订阅。如果不是这种情况,请告诉我。

      【讨论】:

      • 是的!用户登录到应用程序,他应该能够更新他们的订阅。目前我没有在客户端使用任何会话,只是使用 Mssql 记录检查用户名密码
      • 您需要将会话存储在服务器上并检查会话以查看他们是否仍然登录。如果是,则绕过身份验证。
      【解决方案4】:

      我会这样做:用户点击您应用中的“更新订阅”按钮。然后您的应用程序从您的服务器获取一个随机字符串(GUID 或类似的东西)。然后,您的应用程序会打开一个带有地址 www.yourserver.com?token= 的 Web 浏览器,其中 token 是应用程序从服务器获取的字符串。您使用该令牌来识别和授权用户。出于安全原因,此令牌应在有限时间内有效,每次用户单击按钮时都会有所不同。

      免责声明:我不是安全专家,此方法可能包含明显的安全漏洞。使用风险自负。

      【讨论】:

        猜你喜欢
        • 2010-10-10
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 2014-09-09
        • 2011-06-13
        • 2016-04-30
        • 1970-01-01
        相关资源
        最近更新 更多