我已经构建了一个 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 类:
public class LoginDto
{
[Required]
public string UserLogin { get; set; }
[Required]
public string UserPassword { get; set; }
}
在使用 Checkmarx 工具进行漏洞检查后,我收到了一份报告,上面写着:
/ /***/Controllers/AccountController.cs的第55行的方法索引 定义了UserPassword,它被指定包含用户密码。但是,虽然后来将明文密码分配给 UserPassword,但此变量永远不会从内存中清除。
我知道字符串是不可变的,并且会在内存中保留一段不确定的时间。
该工具(checkmarx)有一个建议说:
具体建议 - .NET:
- 与其将密码存储在不可变的字符串中,不如使用加密的内存对象,例如 SecureString 或 ProtectedData。
我发现其他建议也说我使用SecureString而不是字符串来操作/存储用户密码,但我认为这仅适用于 MVC 或 WPF 应用程序,我不知道如何在 ASP.NET WebAPI 上应用它2 上下文,我必须在其中公开与语言无关的服务。
任何人对我如何在 ASP.NET WebAPI 2 上实现这种安全级别(或者即使可能)有任何建议?