Asp.net核心Razor页面-页面加载后设置变量值

时间:2018-11-07 08:50:02

标签: c# cookies razor asp.net-core csrf

我的索引页面模型中有一个名为“ 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”,因此该页面尚不存在XSRF-TOKEN cookie。

在索引PageModel中,我具有OnGet和OnPostSignIn方法,并且尝试使用以下两种方法来设置cookie变量:

cookie = GetXsrfToken();

但是OnGet方法被调用为时过早,而将其放入OnPost方法中意味着它将被调用为时过晚。

因此,一旦页面完全加载,就需要设置它,但是我不确定如何实现这一点。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

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>
}