Cross-Site Request Forgery in .NET
Prevention
ASP.NET Core includes three filters for working with antiforgery tokens:
ValidateAntiForgeryToken
AutoValidateAntiforgeryToken
IgnoreAntiforgeryToken
ValidateAntiForgeryToken
is an action filter that can be applied to an individual action, a controller, or globally. Requests made to actions that have this filter applied are blocked unless the request includes a valid anti-forgery token.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task <iactionresult> RemoveLogin(RemoveLoginViewModel account)
{
ManageMessageId message = ManageMessageId.Error;
var user = await GetCurrentUserAsync();
if (user != null) {
var result = await _userManager.RemoveLoginAsync(
user, account.LoginProvider, account.ProviderKey
);
if (result.Succeeded) {
await _signInManager.SignInAsync(user, isPersistent: false);
message = ManageMessageId.RemoveLoginSuccess;
}
}
return RedirectToAction(nameof(ManageLogins), new { Message = message });
}
The ValidateAntiForgeryToken
attribute requires a token for requests to the action methods it decorates, including HTTP GET requests. If the ValidateAntiForgeryToken
attribute is applied across the app’s controllers, it can be overridden with the IgnoreAntiforgeryToken
attribute.
The AutoValidateAntiforgeryToken
filter works identically to the ValidateAntiForgeryToken attribute, except that it doesn’t require tokens for requests made using the following HTTP methods:
- GET
- HEAD
- OPTIONS
- TRACE
References
OWASP - Cross-Site Request Forgery Cheat Sheet Microsoft - Preventing Cross-Site Request Forgery Attacks MITRE - CWE 352