我的索引页面模型中有一个名为“ 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方法中意味着它将被调用为时过晚。
因此,一旦页面完全加载,就需要设置它,但是我不确定如何实现这一点。任何建议将不胜感激。
答案 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>
}