C# 如何缓存桌面应用程序客户端的登录数据

C# 如何缓存桌面应用程序客户端的登录数据,c#,winforms,authentication,asp.net-web-api,C#,Winforms,Authentication,Asp.net Web Api,有一个winform客户端连接到服务器,并通过提供用户名和密码进行身份验证 用户第一次将其用户名/密码发送到服务器,之后如果未注销,则无需再次进行身份验证(如Github客户端或Windows Live Mail) 所以我想知道: 如果用户名/密码有效,服务器应该返回什么 真/假值还是其他 在下一次运行时,我如何检查 如果用户上次通过身份验证并已登录?应该使用哪些值 我查对了吗?考虑不允许数据篡改 如果我在应用程序设置中保存哈希密码,如何避免被另一个密码窃取 (在stackoverflow中

有一个winform客户端连接到服务器,并通过提供用户名和密码进行身份验证

用户第一次将其用户名/密码发送到服务器,之后如果未注销,则无需再次进行身份验证(如
Github
客户端或
Windows Live Mail

所以我想知道:

  • 如果用户名/密码有效,服务器应该返回什么 真/假值还是其他
  • 在下一次运行时,我如何检查 如果用户上次通过身份验证并已登录?应该使用哪些值 我查对了吗?考虑不允许数据篡改
  • 如果我在应用程序设置中保存哈希密码,如何避免被另一个密码窃取

(在stackoverflow中是否避免了欣赏?;)

这取决于您试图保护的资源的价值;还有谁可以访问本地计算机等

  • 只需在应用程序中缓存用户名/密码。用户首次输入用户名/密码时,请将其保存在注册表中的某个位置。下次启动应用程序时,从注册表读取并将值提供给服务器

  • 这显然是一个安全风险,因为有人可以从注册表中读取用户名/密码,所以在将用户名/密码保存到注册表之前,请使用类似的方法对其进行加密

  • 下一个问题是,您可能必须在应用程序中硬编码解密密钥。这意味着任何有权访问你的应用程序二进制文件的人都可以计算出你正在使用的算法/密钥,并使用这些知识解密存储在注册表中的密钥。但到这个时候,大多数琐碎的尝试都会被劝阻。您可以尝试改用,这样您就不必在应用程序中硬编码加密密钥,但它更复杂


  • 如果不想在应用程序中缓存用户名/密码,可以改用HMAC身份验证。您可以在第一次呼叫期间使用用户名/密码对用户进行身份验证,但如果身份验证成功,则会返回会话密钥作为响应。您可以使用该会话密钥对其余调用进行身份验证,如图所示

    问候,,
    巴勃罗

    谢谢@Grynn。所以我把它保存在注册表之类的地方,然后对它进行加密。现在,如果有人篡改了用户名/密码并输入了随机用户名/密码,我怎么看它是有效的?如果不从服务器请求,您仍然需要结束对服务器的请求,但用户无需再次输入任何内容。。。所以它是无缝的。人们做的另一件事是,每7天检查一次,因此如果我验证一次用户/密码组合,我只会在7天后再次验证它。服务器的界面类似于:“https://server/auth”,你会发送一篇带有用户名/密码的帖子,服务器会以“OK”或“FAIL”(或者类似JSON的方式)响应{结果:好的,从上次开始的天数:3}…)