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/
我的网站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/