当前位置: 首页 > 知识库问答 >
问题:

ValidateAntiForgeryTokenendpoint属性在Asp中的使用情况。每个CSRF攻击的Net core Angular web应用程序

鄂和璧
2023-03-14

我有一个使用asp的web应用程序。net核心(3.1)后端和角度前端(8.2.11)。它使用asp。net身份验证框架,用于用户身份验证。它将身份验证令牌存储在本地存储器中,用作请求中的身份验证头。sense controller中的所有功能都正常。只有用户登录时,才能访问endpoint。如果用户注销,则直接在浏览器中键入endpoint将被拒绝。

我仍然不确定这样的设置是否可以防止跨站点请求伪造(XSRF/CSRF)攻击。我知道使用cookie存储身份验证令牌容易受到CSRF的影响,我在某些endpoint上尝试了一点[ValidateAntiForgeryToken]属性,它当然破坏了这些endpoint。我知道在Razor页面中,表单会自动注入防伪令牌。那么,我需要在我的角度前端设置它吗?如果是,怎么做?(我在网上搜索了一下,说明到处都是,非常混乱,没有明确的共识)。

共有2个答案

阚小云
2023-03-14

Angular提供默认启用的内置反CSRF/XSRF保护。

Angular的HttpClient对这项技术的客户端部分有内置支持。在HttpClient指南中了解更多

请注意,默认情况下,HttpClient上会启用CSRF/XSRF保护,但仅当后端在用户身份验证时将名为XSRF-TOKEN的cookie设置为随机值时,CSRF/XSRF保护才起作用。

郭俊拔
2023-03-14

将中间件添加到生成AntiforgeryToken的中间件管道中,并将该令牌嵌入连接到响应的非http专用cookie中:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddAntiforgery(options => {
            options.HeaderName = "X-XSRF-TOKEN";
        });
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntiforgery antiforgery)
    {
        ...;
        app.Use((context, next) => {
            var tokens = antiforgery.GetAndStoreTokens(httpContext);
            httpContext.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { Path = "/", HttpOnly = false });
        });
    }
}

我为此创建了一个包含此中间件的小包。

将您的角应用配置为通过javascript读取非超文本传输协议cookie(XSRF-TOKEN)的值,并将此值作为X-XSRF-TOKEN头传递给由HttpClient发送的请求:

@NgModule({
  declarations: [...],
  imports: [
    HttpClientModule,
    HttpClientXsrfModule.withOptions({
      cookieName: 'XSRF-TOKEN',
      headerName: 'X-XSRF-TOKEN'
    }),
    ...
  ],
  providers: [...],
  bootstrap: [AppComponent]
})
export class AppModule { }

现在,您可以使用[ValidateAntiforgeryToken]属性装饰控制器方法:

[ApiController]
[Route("web/v1/[controller]")]
public class PersonController : Controller
{
    private IPersonService personService;
    public PersonController(IPersonService personService)
    {
        this.personService = personService;
    }
    
    [HttpPost]
    [Authorize]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult<Person>> Post([FromBody] Person person)
    {
        var new_person = await personService.InsertPerson(person);
        return Ok(new_person);
    }
}

请确保您发送的请求具有以下类型的url,如下所述:

  • /my/url

错误的url:

  • https://example.com/my/url

我使用身份Cookie身份验证:

services.AddAuthentication(/* No default authentication scheme here*/)

自从ASP。NET Core身份验证中间件只负责XSRF-TOKEN头,而不负责X-XSRF-TOKENcookie,您不再容易受到跨站点请求伪造的影响。

您会注意到,在登录/注销之后,发送的第一个webrequest仍将被XSRF保护阻止。这是因为标识在webrequest的生存期内不会更改。因此,当发送Loginwebrequest时,响应将附加一个带有csrf令牌的cookie。但此令牌仍然使用您尚未登录时的身份生成。

发送Logout网络请求也同样重要,响应将包含一个带有csrf令牌的cookie,就像您仍然登录一样。

要解决这个问题,您只需在每次登录/注销时发送另一个webrequest,它实际上什么都不做。在此请求过程中,您将再次拥有正确的身份,以便生成csrf令牌。

logoutClicked() {
  this.accountService.logout().then(() => {
    this.accountService.csrfRefresh().then(() => {
      this.activeUser = null;
    });
  }).catch((error) => {
    console.error('Could not logout', error);
  });
}

登录时相同

this.accountService.login(this.email, this.password).then((loginResult) => {
  this.accountService.csrfRefresh().then(() => {
    switch (loginResult.status) {
      case LoginStatus.success:
        this.router.navigateByUrl(this.returnUrl);
        this.loginComplete.next(loginResult.user);
        break;
      default:
        this.loginResult = loginResult;
        break;
    }
  });
});

csrfRefresh方法的内容

public csrfRefresh() {
  return this.httpClient.post(`${this.baseUrl}/web/Account/csrf-refresh`, {}).toPromise();
}

服务器端

[HttpPost("csrf-refresh")]
public async Task<ActionResult> RefreshCsrfToken()
{
    // Just an empty method that returns a new cookie with a new CSRF token.
    // Call this method when the user has signed in/out.
    await Task.Delay(5);

    return Ok();
}

这是我在自己的应用程序中登录用户的地方

 类似资料:
  • 问题内容: 我想要一种简单的,最好是基于注释的方式,将外部属性注入到Java程序中,而无需使用spring框架() SomeClass.java application.yml 在标准库中是否有建议的方法? 问题答案: 我最终使用apache commons配置: pom.xml: src /…/ PropertiesLoader.java /src/main/resources/applicat

  • 我们使用的是Spring Boot 2.3.4 我们有一些只需要应用程序的单元测试。要加载的属性(包括其所有配置文件管理aso)。在不启动完整的Spring Boot服务器的情况下可以做到这一点吗? 编辑: 我尝试了@SpringBootTest注释,但它总是启动整个服务器,因为我引用了@SpringBootApplication类(或者它是自动引用的)。实际上,您不需要所有其他注释,比如@Con

  • 我们正在运行weblogic,似乎有内存泄漏-我们最终用完了堆空间。 我们在服务器上有5个应用程序(5个war部署)。 您能想到一种方法来收集每个应用程序的内存使用情况吗? (然后我们可以通过查看相应应用程序中的代码来集中搜索。) 我已经运行jmap来获取堆转储并在jvisualvm中加载结果,但不清楚大部分对象来自何处——例如字符串。 我在想,weblogic可能会在每个应用程序中使用单独的类加

  • 本文向大家介绍在Django中预防CSRF攻击的操作,包括了在Django中预防CSRF攻击的操作的使用技巧和注意事项,需要的朋友参考一下 CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。 CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。 ( 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…) 造成的问题:个人隐私泄露以及财

  • 什么是CSRF CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。 那么CSRF到底能够干嘛呢?你可以这样简单的理解:攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求。攻击者只要借助少许的社会工程学的诡计,例如通过QQ等聊天软件发送的链接(有些还伪装成

  • 本文向大家介绍csrf 攻击是怎样攻击的? 如何防御相关面试题,主要包含被问及csrf 攻击是怎样攻击的? 如何防御时的应答技巧和注意事项,需要的朋友参考一下 get, post, delete, 分开, 避免使用get修改数据 避免让第三方站点访问cookie 对referrer进行验证 token 阻止第三方请求 .