gpt4 book ai didi

asp.net - 在 ASP.Net MVC 中使用 @Html.AntiForgeryToken() 提供 CSRF token 的替代方法

转载 作者:太空狗 更新时间:2023-10-29 19:31:06 25 4
gpt4 key购买 nike

我正在使用 ASP.Net MVC 后端开发 angular 2 应用程序。为此,index.cshtml 包含了 @Html.AntiForgeryToken(); 所以我取回了一个隐藏的输入元素,其值是 Token。在我的前端,我可以获取此 token 并将其用于我的请求。到目前为止一切顺利。

现在由于用户信息用于在后端生成 token ,所以我必须在某些情况下切换 token 。问题描述here in this question .

现在,由于我不想在我的应用程序中重新加载整个页面,所以我必须使用一种解决方法。为此,我在后端创建了一个部分 View ,它只是使用 @Html.AntiForgeryToken(); 作为 ActionResult 使用如下简单方法分发此输入:

public ActionResult GetAntiForgery()
{
return PartialView("~/Views/Home/AntiForgery.cshtml");
}

登录/注销后,我从前端调用此函数并替换我现有的 AntiForgery 输入元素 的值,如下所示:

getAntiForgery(url:string) {
return this._http.get(url)
.map((response:any) => {
let originalXsrfElement = <HTMLInputElement>document.querySelector('[name=__RequestVerificationToken]');
let body = response._body;

if(body) {
let helperElem = document.createElement('div');
helperElem.innerHTML = body;
let helperInputElem = <HTMLInputElement>helperElem.firstChild;
originalXsrfElement.value = helperInputElem.value;
}

return response;
});
}

我什至无法告诉你什么最让我烦恼。我讨厌提出额外的请求(但我们不要在这里深入探讨)但对我来说更糟糕的是我必须请求一些东西,取回一个 html 字符串并且必须从中提取 token 字符串。

如果我是后端人员,我会杀死前端人员(我..),因为他甚至想创建一个额外的局部 View ,创建一个额外的方法,并且总是在登录/注销时执行两个请求而不是一个。

有没有更好的方法?例如,我想调用一个方法,该方法只分发带有适当标记的 JSON 而不是 HTML 片段。更好的是,在后端的现有 JsonResult 方法上,我想添加新的 CSRF Token 作为属性。

我不是后端架构师,所以一般来说我的做法可能有一些错误,但我的后端同事不介意我在那里做什么,所以应该不会差得太远。

感谢任何提示。

最佳答案

您可以在操作中使用 AntiForgery.GetToken 为返回的 JSON 设置一些属性:

string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
json.RequestVerificationToken = cookieToken + ":" + formToken;

然后,将它传回您下一个 AJAX 请求的 header 中:

$.ajax("/my/awesome/url", {
type: "post",
contentType: "application/json",
data: { ... },
dataType: "json",
headers: {
'RequestVerificationToken': requestVerificationToken
}
});

因为它不再由 cookie 处理,您不能只使用标准的 ValidateAntiForgeryToken 属性。您需要手动检查 header 并对其进行验证。但是,您应该能够创建一个您可以改用的自定义属性:

AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public sealed class ValidateAntiForgeryTokenFromHeaderAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var request = filterContext.HttpContext.Request;

string cookieToken = "";
string formToken = "";

IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
AntiForgery.Validate(cookieToken, formToken);
}
}

然后,只需使用 [ValidateAntiForgeryTokenFromHeader] 装饰您的操作即可。

[代码改编自 http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks]

关于asp.net - 在 ASP.Net MVC 中使用 @Html.AntiForgeryToken() 提供 CSRF token 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37969013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com