Asp.net core Razor Page - установка значения переменной после загрузки страницы - PullRequest
0 голосов
/ 07 ноября 2018

В моей модели страницы индекса есть строковая переменная с именем cookie. Этот файл cookie устанавливается с использованием следующего метода:

private string GetXsrfToken()
{
    this.Request.Cookies.TryGetValue("XSRF-TOKEN", out var token);
    var xsrfToken = token ?? "TestToken";
    return xsrfToken;
}

Тогда на моей странице Razor он используется так:

....
<div>
    <input type="submit" name="btn_signin" value="Sign In" id="btn_signin" formaction="~/SignIn/?_csrf=@Model.cookie" default />
</div>
....

Проблема, возникающая у меня при первой загрузке страницы, - метод GetXsrfToken () возвращает «TestToken». После отладки я понял, что это потому, что cookie устанавливается перед загрузкой страницы, поэтому cookie XSRF-TOKEN для этой страницы еще не существует.

В IndexModelModel у меня есть методы OnGet и OnPostSignIn, и я попытался установить переменную cookie в обоих случаях, используя:

cookie = GetXsrfToken();

Однако метод OnGet вызывается слишком рано, и его добавление в метод OnPost означает, что он будет вызван слишком поздно.

Так что его нужно установить после полной загрузки страницы, но я не уверен, как это реализовать. Любой совет будет оценен.

1 Ответ

0 голосов
/ 08 ноября 2018

ASP.NET Core внедрит скрытое поле формы с именем __RequestVerificationToken в конце каждой формы с зашифрованным значением и передает это же значение в файл cookie, который отправляется с запросом формы:

<input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkS ... s2-m9Yw">

Ссылка: https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-2.1

Тогда вы можете использовать Jquery для получения токена защиты от подделки и динамического изменения атрибута кнопки:

@section Scripts {
  <script type="text/javascript">

    $(function () {
        var csrf = $('input[name="__RequestVerificationToken"]').val();
        $("#btn_signin").attr("formaction", "~/SignIn/?" + csrf);
        //alert(csrf);
    })
  </script>
}
...