我如何在 ASP.NET Core 6 Web API 中使用防偽令牌與 iOS 或 Android 應用程式等外部使用者?我不需要對請求進行用戶身份驗證。該應用程式托管在另一個域上。
我開發了一個帶有 Antiforgery Token(點擊此鏈接)和 ASP.NET 6 Razor Pages的 Web API 。一切正常。但是我怎樣才能開發一個使用這個 Web API 的外部應用程式呢?問題,我不知道如何從“外部”應用程式創建防偽令牌?我如何配置應用程式以使用帶有防偽令牌的 Web API?
uj5u.com熱心網友回復:
構建API時不需要實作針對CSRF攻擊的Anti-Forgery Token保護,大多數API是從外部客戶端呼叫的,API保護使用不同的方法實作:
- 使用 API 密鑰。
- 使用基本身份驗證。
- 使用 OpenID 連接。
因為我們想要的是防止惡意客戶端呼叫我們的 API。
但是,如果您在網站上使用 Ajax 呼叫 API,則可以集成防偽令牌保護,您可以在 StackOverflow 上查看此答案,了解有關如何實作它的更多詳細資訊。
但由于您要從外部應用程式呼叫 API,只需使用上述方法之一。
查看Microsoft 檔案上的這篇文章,了解有關 CSRF 攻擊以及如何實施防偽令牌保護的更多詳細資訊。
另外,請查看 RedHat 的這篇文章以獲取有關API 安全性的更多資訊。
uj5u.com熱心網友回復:
我不同意“在構建 API 時沒有必要針對 CSRF 攻擊實施 Anti-Forgery Token 保護”的答案。
仍然存在入侵者可以以某種方式強制客戶端應用程式發送惡意請求的風險。
要在 .NET Web API 中配置防偽保護(不使用 MVC 視圖),您需要使用包Microsoft.AspNetCore.Antiforgery.
請記住,有兩個正在驗證的令牌:Cookie 令牌和請求令牌(來自 HTTP 標頭)。
// Field IAntiforgery _antiforgery; var tokens = _antiforgery.GetAndStoreTokens(HttpContext);因此,
tokens將包含以下值:{ "CookieToken": "CfDJ8JPuS3COPd9AmHCMBz_IFVdVzR8cfeD2or9v3qMLlWgRiN812hKbkh4o8TpYl4AdA3uJ3FeoY3eozx59q_uSnloXl80nLEd6twLzkDdn4AifcsGWcwaAxWSrGTui0vwl7-SHjftCfkbj9pAlDC_DS0Q", // Ignore this: built-in mechanism for forms "FormFieldName": "__RequestVerificationToken", "HeaderName": "X-XSRF-TOKEN", "RequestToken": "CfDJ8JPuS3COPd9AmHCMBz_IFVfnP50wBywG2WJmFoYA7nx-VGzBjPRY16-p3BBFRMUGHt4cz-M-VrZ_jX_7vUoIt0OX3xhHNw8swt0CebGa4P41cVej2F_DvvayOvrhbY6s3Z2U1aZWHmAvBT8NlH7ueRE" }注意
CookieToken和RequestToken是不同的。Cookie 令牌是自動處理的。但是Request Token應該由我們處理。
創建驗證中間件:
public class AntiforgeryMiddleware : IMiddleware { private readonly IAntiforgery _antiforgery; public AntiforgeryMiddleware(IAntiforgery antiforgery) { _antiforgery = antiforgery; } public async Task InvokeAsync(HttpContext context, RequestDelegate next) { var isGetRequest = string.Equals("GET", context.Request.Method, StringComparison.OrdinalIgnoreCase); if (!isGetRequest) { _antiforgery.ValidateRequestAsync(context).GetAwaiter().GetResult(); } await next(context); } }在您的 Web API 應用程式中配置 DI:
// Startup.cs public void ConfigureServices(IServiceCollection services) { // ... // Extension method comes from the `Microsoft.AspNetCore.Antiforgery` package services.AddAntiforgery(options => { options.HeaderName = "X-XSRF-TOKEN"; }); services.AddScoped<AntiforgeryMiddleware>(); }配置驗證中間件:
// Startup.cs public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... app.UseMiddleware<AntiforgeryMiddleware>(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }創建 XSRF 令牌端點:
[Route("api/xsrf-token")] [ApiController] public class AntiForgeryController : Controller { private IAntiforgery _antiforgery; public AntiForgeryController(IAntiforgery antiforgery) { _antiforgery = antiforgery; } [IgnoreAntiforgeryToken] public IActionResult Get() { // Creates and sets the cookie token in a cookie // Cookie name will be like ".AspNetCore.Antiforgery.pG4SaGh5yDI" var tokens = _antiforgery.GetAndStoreTokens(HttpContext); // Take request token (which is different from a cookie token) var headerToken = tokens.RequestToken; // Set another cookie for a request token Response.Cookies.Append("XSRF-TOKEN", headerToken, new CookieOptions { HttpOnly = false }); return NoContent(); } }在客戶端向 URL 發出請求
/api/xsrf-token。然后讀取請求令牌 cookie
XSRF-TOKEN并將其設定X-XSRF-TOKEN為非 GET 請求的HTTP 標頭:X-XSRF-TOKEN: <request-token>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/401744.html
標籤:C# 网站 asp.net核心 asp.net-core-webapi 防伪令牌
上一篇:日期未被識別為有效的日期時間
