ASP.NET 核心 WebAPI 安全注意事项

ASP.NET Core WebAPI Security Considerations

我的网站API 就是供我的UI 使用的API 后端。事实上,我的 UI 可能会使用 10 种 WebAPI 服务。

我很难理解在安全方面我需要考虑什么。

我的 API 使用不记名令牌进行保护,并且仅允许 https。我设置了 CORS,他们只允许源 https://my-front.end 这一切都很好。

但是..我如何防止 C/XSRF 和 WebAPI 上的重放攻击?我什至需要吗?

使用 ASP.NET MVC 项目设置 anti-CSRF 相当轻松,但是如何在 WebAPI 项目上进行设置,据我所知,它依赖于发送信息,在服务器上生成,在请求的 body 中通过另一个通道(例如 cookie 或 header)发送给客户端。我读到您可以通过使用随机数(例如时间戳和随机数)来防止重放攻击——有些方法——但找不到任何实现示例。

还有什么我需要考虑的吗?


编辑:前端使用 vue.js,但我们有非常称职的 JS 程序员,因此任何 front-end 实现都不会成为问题。这只是找出需要做什么的问题!

可能还值得注意,为了显而易见,WebAPIs 和 FrontEnd 运行 在不同的服务器上,所以这些都是有效的跨源调用。

好的。首先,您需要在 header 中发送 XSRF 令牌。为此,您需要转到您的 ConfigureServices 方法并设置 AntiForgery 服务以期待此 header。

public void ConfigureServices(IServiceCollection services)
{
    services.AddAntiforgery(x => x.HeaderName = "X-XSRF-TOKEN");
    services.AddMvc();
}

接下来您需要生成令牌。因为前端和API是不同的服务,所以做这个的时候需要算出来。例如,您可以在登录时执行此操作,或者您可以使用专用端点执行此操作,但最终结果是相同的。

您可以 return header 中的令牌值或 cookie 由您决定。在我的示例中,我使用了一个 Cookie,稍后我将对其进行解释,但您可以根据需要使用 header。

public class HomeController : Controller
{
    private readonly IAntiforgery _antiForgeryService;

    public HomeController(IAntiforgery antiForgeryService)
    {
        _antiForgeryService = antiForgeryService;
    }

    public IActionResult GetToken()
    {
        var token = _antiForgeryService.GetTokens(HttpContext).RequestToken;
        HttpContext.Response.Cookies.Append("XSRF-TOKEN", token, new CookieOptions { HttpOnly = false });
        return new StatusCodeResult(StatusCodes.Status200OK);
    }
}

IAntiforgery 服务应该已经可以使用了(它是您将在 .net 核心服务中使用的 "AddMVC" 调用的一部分)。

好的,现在我们已经 returned 了一个带有标记值的 cookie。现在我们只需要能够将其发送回去。

这里有一些 jQuery 做跑腿工作

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.1.4/js.cookie.min.js"></script>
<script type="text/javascript">
    var token = Cookies.get("XSRF-TOKEN");

    $.ajax({
        url: "/",
        contentType: "application/json",
        type: "POST",
        headers: {
            "X-XSRF-TOKEN": token
        }
    });
</script>

现在需要注意的是 AngularJS 会自动执行此操作。当使用 $http 时,它会寻找一个名为 "XSRF-TOKEN" 的 cookie,然后它会自动将其作为 header 发送。因为您使用的是 Vue,所以您基本上无论如何都会这样做,但更多的是手动过程。

同样重要的是要注意,不要将其设置为期望 cookie 返回为 CSRF 令牌。否则你已经打败了 CSRF 的全部目的。

然后您可以继续使用 AntiForgery 属性装饰您的 actions/controllers。

[AutoValidateAntiforgeryToken]
public class HomeController : Controller
{

总而言之,它基本上可以归结为:

  • 设置 .net Core AntiForgery 以期望 header 值用于 CSRF 令牌
  • 有一个端点可以手动生成一个令牌供您使用,并且 return 它作为 cookie/header
  • 让您的前端读取此值并将其存储以供后续请求使用
  • 在后续请求中将令牌值作为 header(不是 cookie)

大部分取自此处:http://dotnetcoretutorials.com/2017/05/18/csrf-tokens-angularjsjquery-asp-net-core/