我正在使用ASP.Net WebAPI和WPF开发客户端/服务器应用程序。 现在,我正在考虑通过https进行基本身份验证来验证客户端。您可以建议更好的解决方案,但Windows身份验证和服务器端会话对我来说不起作用。
对于基本身份验证,我需要客户端上的密码以纯文本(base64)在每次请求时通过网络发送,对吗?
但我不希望用户在每次请求时重新输入密码,因此我在应用程序启动时有一个登录窗口。
WPF PasswordBox使用SecureString,但未绑定到viewmodel。但至少在请求之前我必须将密码作为普通字符串将其编码为base64。 所以无论我做什么,迟早密码都会以纯文本形式存储在RAM中。
为以后的请求保留密码的最佳做法是什么?
那么我该如何以合理安全的方式处理这个问题呢? 大型玩家(MS,Google,Apple,...)的其他应用程序不会为每次通话请求我的密码,因此必须有办法。
答案 0 :(得分:0)
您应该阅读身份验证令牌,这是一种常用的方法,而asp.net-web-api框架提供了OWin提供的大量功能。
基本上流程如下:
好处:
你可以在这里阅读: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
至于你的WPF客户端:
您可以使用以下命令为您的http / web-api请求创建.net客户端:
HttpClient
https://msdn.microsoft.com/en-us/library/system.net.http.httpclient%28v=vs.118%29.aspx
一些伪代码将如下所示:
public async Task<IEnumerable<DataContainer>> GetDataForTarget(string id)
{
var requestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(new Uri(Host),
string.Format("api/Data?id={0}", id)));
var response = await Client.SendAsync(requestMessage);
//etc...
}
注意:强>
要使基于令牌的安全性起作用,您需要https,否则可以拦截令牌。知道令牌的每个人都可以代表相应的用户拨打web-api。因此,基本上问题从保护密码转变为保护令牌。令牌的好处是它的生命周期应该比密码短得多,这就是为什么它更安全。然而,将令牌存储在SecureString
。
同时在服务器端
如果用户可以选择自己的密码,那么这是一种良好的做法(如果不这样做,甚至是不道德的),您可以在服务器上使用单向加密机制来存储密码。
这可以通过使用(加密 - 强)随机salt
和使用hash
的非对称 - salt
加密来实现。
要验证用户,只需使用存储的salt加密传入密码,并检查它是否为您提供存储的哈希值。在这种情况下,您的服务器上不会存储任何实际密码,也无法检索用户密码(......嗯,排除了一些技术细节)。