我正在使用ASP.Net WebAPI和WPF开发客户端/服务器应用程序。现在,我正在考虑使用基于https的基本身份验证来对客户端进行身份验证。您可以提出更好的解决方案,但是Windows身份验证和服务器端会话对我不起作用。
对于基本身份验证,我需要使用纯文本(base64)客户端上的密码,以便在每次请求时通过电线发送密码,对吗?
但是我不希望用户在每次请求时都重新输入密码,因此我在应用程序启动时有一个登录窗口。
WPF PasswordBox使用SecureString,并且未绑定到视图模型。但是至少在请求之前,我必须将密码作为普通字符串获取,才能将其编码为base64。因此,无论我做什么,迟早密码都会以纯文本格式存储在RAM中。
保留密码以备后用的最佳做法是什么?
那么,如何以一种合理的安全方式处理此问题?大型企业的其他应用程序(MS,Google,Apple等)不会在每次通话时都要求输入密码,因此必须找到一种方法。
您应该阅读身份验证令牌,这是一种常用的方法,而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/zh-CN/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
。
要验证用户,只需使用存储的盐加密输入的密码,然后检查它是否为您提供存储的哈希值。在这种情况下,实际的密码将不会存储在您的服务器上,并且无法检索用户密码(..嗯……排除了一些技术细节)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句