在這篇短文中,我將向您介紹如何ASP.NET Core Razor頁面中禁用防偽令牌驗證。 Razor頁面是ASP.NET Core 2.0中增加的一個頁面控制器框架,用於構建動態的、數據驅動的網站;支持跨平臺開發,可以部署到Windows,Unix和Mac操作系統。 跨站點請求偽造(也稱為XSRF ...
在這篇短文中,我將向您介紹如何ASP.NET Core Razor頁面中禁用防偽令牌驗證。
Razor頁面是ASP.NET Core 2.0中增加的一個頁面控制器框架,用於構建動態的、數據驅動的網站;支持跨平臺開發,可以部署到Windows,Unix和Mac操作系統。
跨站點請求偽造(也稱為XSRF或CSRF)是對Web托管應用程式的攻擊,因為惡意網站可能會影響客戶端瀏覽器和瀏覽器信任網站之間的交互。這種攻擊是完全有可能的,因為Web瀏覽器會自動在每一個請求中發送某些身份驗證令牌到請求網站。這種攻擊形式也被稱為 一鍵式攻擊 或 會話控制,因為攻擊利用了用戶以前認證的會話。關於這個話題可以看我的另一篇博客:ASP.NET Core 防止跨站請求偽造(XSRF/CSRF)攻擊。
Razor頁面被設計為預設啟動防跨站請求偽造攻擊的,防偽令牌生成和驗證被自動包含在Razor頁面中。但是,在某些情況下,您可能想禁用它。
全局禁用
要在Razor頁面中全局禁用防偽令牌驗證,可以在Startup
類的ConfigureServices
方法中禁用:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddRazorPagesOptions(o=>
{
o.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});
}
這將關閉整個應用程式的防偽令牌驗證。請註意,禁用防偽令牌驗證不會阻止生成隱藏欄位或cookie。它只是跳過驗證過程。
我們知道防偽令牌是通過FormTagHelper
生成的,好在ASP.NET Core MVC提供了全局設置標簽助手的方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().InitializeTagHelper<FormTagHelper>((helper, context) => helper.Antiforgery = false);
}
所以全局禁用防偽令牌驗證的完整代碼如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddRazorPagesOptions(o=>
{
o.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
}).InitializeTagHelper<FormTagHelper>((helper, context) => helper.Antiforgery = false);
}
部分禁用
如果您希望僅禁用特定方法或頁面模型的驗證,包括如下兩個方法:
在
Startup
類的ConfigureServices
方法進行配置,不過要提供頁面的路徑:
在此處,我們禁用了 demo 頁面的防偽令牌驗證。public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddRazorPagesOptions(opotions => { opotions.Conventions.AddPageApplicationModelConvention("/demo", pageApplicationModel => pageApplicationModel.Filters.Add(new IgnoreAntiforgeryTokenAttribute())); }); }
在
PageModel
上面使用標記:[IgnoreAntiforgeryToken(Order = 1001)] public class DemoModel : PageModel { public void OnPost() { } }
ValidateAntiForgeryToken
標記預設的Order
屬性為1000,因此IgnoreAntiforgeryToken
屬性需要一個更高的序號。
上面我們已經說過了禁用防偽令牌驗證不會阻止生成隱藏欄位或cookie,所以需要禁用FormTagHelper
生成令牌。
<form method="post" asp-antiforgery="false">
</form>
關於這個話題就介紹完了,如果您感興趣,不防測試一下。