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

时间:2017-05-17 18:48:28

标签: javascript c# asp.net-core asp.net-core-webapi

我的WebAPI就是我的UI要使用的API后端。事实上,我的UI将使用10个WebAPI服务。

我很难理解我在安全方面需要考虑的事项。

我的API使用承载令牌进行保护,并且仅允许https。我有CORS设置,他们只允许原点https://my-front.end这一切都很好。

但是..如何防范C / XSRF并重放WebAPI上的攻击?我还需要吗?

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

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

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

值得注意的是,为了显而易见,WebAPI和FrontEnd在不同的服务器上运行,因此这些都是有效的跨域调用。

1 个答案:

答案 0 :(得分:9)

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

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

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

您可以在标题或Cookie中返回令牌值,这取决于您。在我的示例中,我使用了Cookie,我稍后会解释,但如果您愿意,可以使用标题。

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服务(它是" AddMVC"您将在.net核心服务中使用的呼叫的一部分)。

好的,现在我们已经返回了一个带有令牌值的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时,它会查找名为&#34; XSRF-TOKEN&#34;的cookie,然后它会自动将其作为标头发送。因为你正在使用Vue,所以你基本上都会这样做,但更多的是手动过程。

同样重要的是要注意,不要将其设置为期望将cookie作为CSRF令牌返回。否则你无论如何都要击败CSRF的整个目的。

然后,您可以继续使用AntiForgery属性装饰您的操作/控制器。

[AutoValidateAntiforgeryToken]
public class HomeController : Controller
{

总之,它基本归结为:

  • 设置.net核心AntiForgery以期望用于CSRF令牌的标头值
  • 拥有一个手动生成令牌供你使用的端点,并将其作为cookie / header返回
  • 让您的前端读取此值并将其存储以用于后续请求
  • 在后续请求中,将标记值作为标题发送(不是cookie)

主要取自这里:http://dotnetcoretutorials.com/2017/05/18/csrf-tokens-angularjsjquery-asp-net-core/