Это немного сложно, но возможно.
Во-первых, вам нужно использовать внедрение зависимостей, чтобы получить несколько вещей:
private readonly IAntiforgery _antiforgery;
private readonly AntiforgeryOptions _options;
public YourController(IAntiforgery antiforgery, IOptions<AntiforgeryOptions> optionsAccessor)
{
_antiforgery = antiforgery;
_options = optionsAccessor.Value;
}
Затем вы можете изменить свое действие, чтобы добавить этоcode:
public IActionResult YourAction(string parameter1, string requestToken)
{
// Begin antiforgery token validation
typeof(DefaultAntiforgery).GetMethod("CheckSSLConfig", BindingFlags.NonPublic | BindingFlags.Instance)
?.Invoke(_antiforgery, new object[] { HttpContext });
var tokens = new AntiforgeryTokenSet(requestToken, HttpContext.Request.Cookies[_options.Cookie.Name], _options.FormFieldName, _options.HeaderName);
if (tokens.CookieToken == null)
{
throw new AntiforgeryValidationException("Cookie token cannot be null");
}
if (tokens.RequestToken == null)
{
throw new AntiforgeryValidationException("Request token cannot be null");
}
typeof(DefaultAntiforgery).GetMethod("ValidateTokens", BindingFlags.NonPublic | BindingFlags.Instance)
?.Invoke(_antiforgery, new object[] { HttpContext, tokens });
// End antiforgery token validation
return Content(parameter1);
}
По сути, это тот же код, который запускается при вызове IAntiforgery.ValidateRequestAsync
, но модифицируется так, чтобы вручную создавать AntiforgeryTokenSet
вместо простого вызова IAntiforgeryTokenStore.GetRequestTokensAsync
. Это означает, что вы можете получить токен запроса из любого места (в данном случае это параметр URL), а не только из данных формы запроса POST.