WPAP-Client for WebAPI - 如何处理密码进行身份验证

时间:2016-03-01 09:52:53

标签: c# asp.net wpf authentication asp.net-web-api

我正在使用ASP.Net WebAPI和WPF开发客户端/服务器应用程序。 现在,我正在考虑通过https进行基本身份验证来验证客户端。您可以建议更好的解决方案,但Windows身份验证和服务器端会话对我来说不起作用。

对于基本身份验证,我需要客户端上的密码以纯文本(base64)在每次请求时通过网络发送,对吗?

但我不希望用户在每次请求时重新输入密码,因此我在应用程序启动时有一个登录窗口。

WPF PasswordBox使用SecureString,但未绑定到viewmodel。但至少在请求之前我必须将密码作为普通字符串将其编码为base64。 所以无论我做什么,迟早密码都会以纯文本形式存储在RAM中。

为以后的请求保留密码的最佳做法是什么?

  • 缓存PasswordBox
  • 缓存SecureString
  • 缓存纯文本字符串,因为它将以RAM的方式存在于
  • 缓存base64编码的字符串,因为至少它是模糊的;)
  • ...?

那么我该如何以合理安全的方式处理这个问题呢? 大型玩家(MS,Google,Apple,...)的其他应用程序不会为每次通话请求我的密码,因此必须有办法。

1 个答案:

答案 0 :(得分:0)

您应该阅读身份验证令牌,这是一种常用的方法,而asp.net-web-api框架提供了OWin提供的大量功能。

基本上流程如下:

  • 在您的网络API验证。
  • 返回令牌
  • 在以下每个web-api / http请求的标题中使用此标记

好处:

  • 不会将用户名和密码存储在内存中(好吧,只需一次通话)
  • 令牌可以在服务器端无效
  • 使用web-api2开箱即用的功能

你可以在这里阅读: 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加密传入密码,并检查它是否为您提供存储的哈希值。在这种情况下,您的服务器上不会存储任何实际密码,也无法检索用户密码(......嗯,排除了一些技术细节)。