Как использовать ValidateAntiForgeryToken в запросе HTTP GET в ASP.NET Core? - PullRequest
0 голосов
/ 01 ноября 2019

Обычно вы используете ValidateAntiForgeryToken с HttpPost, например:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ...

Я хочу использовать ValidateAntiForgeryToken без HttpPost, чтобы я мог передать токен в качестве параметра URL. Как я могу это сделать? Будет ли это работать без HttpPost, и если да, то как называется параметр?

1 Ответ

0 голосов
/ 03 ноября 2019

Это немного сложно, но возможно.

Во-первых, вам нужно использовать внедрение зависимостей, чтобы получить несколько вещей:

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.

...