首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET Core6WebAPI防伪令牌在外部用户(App)中的应用

ASP.NET Core6WebAPI防伪令牌在外部用户(App)中的应用
EN

Stack Overflow用户
提问于 2022-01-02 20:32:53
回答 3查看 7.1K关注 0票数 4

如何在ASP.NET Core6WebAPI中与iOS或Android等外部用户一起使用防伪令牌?我不需要对请求进行用户身份验证。该应用程序托管在另一个域上。

我已经开发了一个带有防伪令牌(遵循这个链接)和ASP.NET 6 Razor页面的Web。一切都在正常工作。但是,如何开发使用此Web的extern应用程序呢?问题是,我不知道如何从“外部”应用程序创建防伪令牌?如何将应用程序配置为使用带有防伪令牌的Web?

EN

回答 3

Stack Overflow用户

发布于 2022-01-02 21:09:10

在构建API时,没有必要实现针对CSRF攻击的防伪造令牌保护,因为API是如何构建和打算使用的,它们需要不同的保护方法,例如:

  • 使用API键。
  • 使用基本身份验证。
  • 使用OpenID连接。

因为目标是防止恶意客户端调用我们的API,所以我们需要验证执行对API请求的客户端应用程序的身份。

为了执行CSRF攻击,主要的条件之一是有一个基于Cookie的身份验证会话(看看这个文章,它详细解释了如何执行CSRF攻击),而API的情况并非如此。

但是,如果您使用来自网站的Ajax调用API,并且您依赖Cookie对用户进行身份验证,则可以(而且应该)集成防伪造令牌保护,您可以检查这个在StackOverflow上回答以了解如何实现它的更多细节。

但是,由于您要从外部应用程序调用API,所以只需使用上述方法之一即可。

有关CSRF攻击和如何实现防伪造令牌保护的更多详细信息,请参阅本文在微软文档上的内容。

此外,请查看RedHat的这篇文章,以获得有关API安全性的更多信息。

票数 4
EN

Stack Overflow用户

发布于 2022-08-31 08:43:07

一段时间前,我曾是一名安全拥护者,所以我知道什么是安全(不过最近没有遵循这个主题)。但在每一次会议或培训中,通常有两件事是正确的:

  1. 安全很难做好.
  2. 安全很难做好.所以千万不要自己动手!!

在您的例子中,问题在于API中没有防伪令牌(CSRF保护)。它仅在MVC中可用,并且有一个很好的理由:

  • HTML使用的是会话,表单是在服务器上呈现的,因此在服务器端生成令牌,发送到HTML并存储在用户会话中进行回发验证。
  • 大多数MVC站点都使用基于Cookie的Auth,受到CSRF攻击后的影响。
  • REST应该是无状态的,这意味着默认情况下没有会话。响应不是HTML,而是XML/JSON数据。"Form“POST发生在其他系统中,并以安全的方式公开防伪令牌。
  • 大多数RestFul API使用的是oAuth2或更多的令牌Auth,它甚至不受CSRF!的影响。

所以答案是对你的问题另一个问题。您在API中使用基于Cookie的授权吗?

如果不使用,那么您不应该使用防伪令牌,它不会影响您的API.,否则您应该切换到Bearer,然后设置.

此外,请忽略编码的答案,因为他们有许多问题。实现将编译,代码肯定会运行,但充满安全问题(Homebrew )。例如存储在Cookie中的令牌,Cookie是浏览器自动附加到请求的CSRF攻击Cookies的基础,GET方法是安全的,甚至无法防止等等。

的本地安全可以提供虚假的信任(是的,我“安全”它)它安全吗?:

票数 3
EN

Stack Overflow用户

发布于 2022-01-02 23:40:23

我不同意“在构建API时没有必要实现防CSRF攻击的防伪造令牌保护”的回答。

在某种程度上,入侵者仍有可能迫使客户端应用程序发送恶意请求。

要在.NET Web中配置防伪造保护(不需要使用Microsoft.AspNetCore.Antiforgery视图),您需要使用包Microsoft.AspNetCore.Antiforgery

请记住,有两个正在验证的令牌: Cookie令牌和请求令牌(来自HTTP报头)。 // Field IAntiforgery _antiforgery;var tokens = _antiforgery.GetAndStoreTokens(HttpContext); 因此,tokens将包含以下值: {“"CfDJ8JPuS3COPd9AmHCMBz_IFVdVzR8cfeD2or9v3qMLlWgRiN812hKbkh4o8TpYl4AdA3uJ3FeoY3eozx59q_uSnloXl80nLEd6twLzkDdn4AifcsGWcwaAxWSrGTui0vwl7-SHjftCfkbj9pAlDC_DS0Q",”:CookieToken //忽略它:表单“FormFieldName”的内置机制:"__RequestVerificationToken","HeaderName":“RequestToken”,"RequestToken":"CfDJ8JPuS3COPd9AmHCMBz_IFVfnP50wBywG2WJmFoYA7nx-VGzBjPRY16-p3BBFRMUGHt4cz-M-VrZ_jX_7vUoIt0OX3xhHNw8swt0CebGa4P41cVej2F_DvvayOvrhbY6s3Z2U1aZWHmAvBT8NlH7ueRE“} 注意,CookieTokenRequestToken是不同的。 Cookie令牌被自动处理。但是请求令牌应该由我们来处理。

  1. 创建验证中间件: 公共类AntiforgeryMiddleware : IMiddleware {私有只读IAntiforgery _antiforgery;公共AntiforgeryMiddleware(IAntiforgery Antifor局){ _antiforgery =防伪;}公共异步任务InvokeAsync(HttpContext context,RequestDelegate next) { var isGetRequest = string.Equals("GET",context.Request.Method,StringComparison.OrdinalIgnoreCase);if (!isGetRequest) {}等待下一个(上下文);}
  2. 在Web API应用程序中配置DI: // Startup.cs公共ConfigureServices(IServiceCollection服务){ // . //扩展方法来自Microsoft.AspNetCore.Antiforgery包services.AddAntiforgery(options => { options.HeaderName =“XSRF”;});services.AddScoped()};
  3. 配置验证中间件: // Startup.cs公共空配置(IApplicationBuilder app,IWebHostEnvironment env) { // .app.UseMiddleware();app.UseEndpoints(端点=> { endpoints.MapControllers();});}
  4. 创建XSRF令牌端点: 路由(“api/xsrf- token”)公共类AntiForgeryController :控制器{私有IAntiforgery _antiforgery;公共AntiForgeryController(IAntiforgery抗伪造){ _antiforgery =反伪造;} IgnoreAntiforgeryToken public IActionResult Get() { //创建和设置Cookie // cookie名称中的cookie令牌将类似于".AspNetCore.Antiforgery.pG4SaGh5yDI“var令牌= _antiforgery.GetAndStoreTokens(HttpContext);//接受请求令牌(与cookie令牌不同) var headerToken = tokens.RequestToken;//为请求令牌Response.Cookies.Append设置另一个cookie (“XSRF”,headerToken,新CookieOptions { HttpOnly = false });返回NoContent();}
  5. 在客户端上,向URL /api/xsrf-token发出请求。 然后读取请求令牌cookie XSRF-TOKEN,并将其设置为非GET请求的X-XSRF-TOKEN HTTP报头: XSRF令牌:
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70559557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档