我已经构建了一个ASP.NET WebAPI 2应用程序,我的一个控制器有一个允许用户登录的方法,这样的东西:
[Route("login")]
[HttpPost]
[SwaggerOperation(Tags = new[] { "ACCOUNT" })]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(ReturnModel<AccountModel, HttpStatusCode>))]
public HttpResponseMessage Login([FromBody]LoginDto userData)
{
ReturnModel<AccountModel, HttpStatusCode> returnObj = new ReturnModel<AccountModel, HttpStatusCode>();
try
{
returnObj = accountService.Login(userData.UserLogin, userData.UserPassword);
if (returnObj.Success)
{
...
}
else
{
...
}
return Request.CreateResponse(returnObj.StatusCode, returnObj);
}
catch (Exception ex)
{
LogUtil.Error(ex);
return Request.CreateResponse(HttpStatusCode.InternalServerError, returnObj);
}
}
LoginDto class:
public class LoginDto
{
[Required]
public string UserLogin { get; set; }
[Required]
public string UserPassword { get; set; }
}
使用Checkmarx工具检查漏洞后,我收到了一条报告:
第55行的方法索引 的 / / *** /控制器/ AccountController.cs 定义UserPassword,指定包含用户密码。 但是,虽然稍后将明文密码分配给UserPassword, 永远不会从内存中清除此变量。
我知道字符串是不可变的,并且在不确定的时间内保留在内存中。
该工具(checkmarx)有一个建议:
具体建议 - .NET:
- 不要将密码存储在不可变字符串中,而是使用加密的内存对象,例如SecureString或ProtectedData。
我发现其他建议也说我使用 SecureString 而不是字符串来操纵/存储用户密码,但我认为这仅适用于MVC或WPF应用程序,我无法弄清楚如何在ASP.NET WebAPI 2上下文中应用它,我必须公开与语言无关的服务。
任何人都对如何在ASP.NET WebAPI 2上实现此级别的安全性(或者即使可能)有任何建议?