0

我已经构建了一个 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 上实现这种安全级别(或者即使可能)有任何建议?

4

0 回答 0