【问题标题】:Asp.net core Razor Page - Setting variable value after page loadsAsp.net core Razor Page - 页面加载后设置变量值
【发布时间】:2019-04-10 16:22:19
【问题描述】:

我的索引页面模型中有一个名为“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 还不存在。

在索引页面模型中,我有 OnGet 和 OnPostSignIn 方法,我尝试在这两种方法中设置 cookie 变量:

cookie = GetXsrfToken();

然而 OnGet 方法被调用得太早,将它放在 OnPost 方法中意味着它会被调用得太晚。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2019-11-12
      • 1970-01-01
      • 2021-10-17
      • 2019-04-25
      相关资源
      最近更新 更多