在Razor Pages Get-handler

时间:2017-12-26 18:44:28

标签: asp.net-core csrf razor-pages

我读到XSRF是为Razor Pages(Core 2.0)“自动”提供的,并且开始想知道它走了多远,所以我针对Razor Pages处理程序创建了一个针对XHR GET的小而简单的测试。令我惊讶的是,它有效,但仔细检查标题后就没有任何XSRF了。最后,我总结“自动”仅适用于形式后场景。

然后我尝试通过添加[ValidateAntiForgeryToken]属性来强制XSRF失败,但它没有任何效果。根本不更改客户端代码,并且不将@Html.AntiForgeryToken()添加到cshtml,该方法仍然运行并返回数据。

在有人说它对HTTP GET无效之前(我已经看到了旧版MVC问题的答案,说明XSRF 只适用于),{{1} 3}}状态:

  

ValidateAntiForgeryToken属性需要一个令牌来处理它所装饰的操作方法的请求,包括HTTP GET个请求。

该属性不应该响应错误吗?我是否需要在某处使用某种配置魔法才能使其正常工作?

此示例的工作原理是将新的“Test”Razor页面添加到ASP.NET Core 2.0 Web App模板项目中,其中包含以下内容。

Test.cshtml.cs:

public class TestModel : PageModel
{
    public void OnGet() { }

    [ValidateAntiForgeryToken]
    public JsonResult OnGetMySecretData() => 
        new JsonResult("requested super-secret data");
}

Test.cshtml:

@page
@model Site.Pages.TestModel
@{
    ViewData["Title"] = "Test";
}

<script>
    function test() {
        xhr = new XMLHttpRequest();
        xhr.open("GET", location.origin + "/Test?handler=mysecretdata");
        xhr.setRequestHeader("Accept", "application/json");
        xhr.onreadystatechange = progress;
        xhr.onerror = notOk;
        xhr.send()
    }

    function progress() {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                document.querySelector("#message").textContent = JSON.parse(xhr.responseText);
            } else {
                notOk();
            }
        }
    }

    function notOk() {
        document.querySelector("#message").textContent = "ERROR " + xhr.responseText + " (" + xhr.status + ": " + xhr.statusText + ")";
    }
</script>

<input type="button" onclick="test()" value="Test" />
<br />
<div id="message"></div>

0 个答案:

没有答案