我有一个使用asp的web应用程序。net核心(3.1)后端和角度前端(8.2.11)。它使用asp。net身份验证框架,用于用户身份验证。它将身份验证令牌存储在本地存储器中,用作请求中的身份验证头。sense controller中的所有功能都正常。只有用户登录时,才能访问endpoint。如果用户注销,则直接在浏览器中键入endpoint将被拒绝。
我仍然不确定这样的设置是否可以防止跨站点请求伪造(XSRF/CSRF)攻击。我知道使用cookie存储身份验证令牌容易受到CSRF的影响,我在某些endpoint上尝试了一点[ValidateAntiForgeryToken]
属性,它当然破坏了这些endpoint。我知道在Razor页面中,表单会自动注入防伪令牌。那么,我需要在我的角度前端设置它吗?如果是,怎么做?(我在网上搜索了一下,说明到处都是,非常混乱,没有明确的共识)。
Angular提供默认启用的内置反CSRF/XSRF保护。
Angular的HttpClient对这项技术的客户端部分有内置支持。在HttpClient指南中了解更多
请注意,默认情况下,HttpClient上会启用CSRF/XSRF保护,但仅当后端在用户身份验证时将名为XSRF-TOKEN的cookie设置为随机值时,CSRF/XSRF保护才起作用。
将中间件添加到生成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-TOKEN
cookie,您不再容易受到跨站点请求伪造的影响。
您会注意到,在登录/注销之后,发送的第一个webrequest仍将被XSRF保护阻止。这是因为标识在webrequest的生存期内不会更改。因此,当发送Login
webrequest时,响应将附加一个带有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 阻止第三方请求 .