gpt4 book ai didi

asp.net-web-api - 防伪 token + Web API (- MVC)

转载 作者:行者123 更新时间:2023-12-04 02:24:52 24 4
gpt4 key购买 nike

如何在没有 ASP.NET MVC 的情况下将防伪 token 与 ASP.NET Web API 一起使用?

Stephen Walther 在 http://stephenwalther.com/archive/2013/03/05/security-issues-with-single-page-apps 中有这篇文章“Preventing Cross-Site Request Forgery Attacks with ASP.NET MVC”。 ...但他的解决方案包括 MVC/Razor 并且在我的前端我不打算包括它。并且有很多类似的文章,解决方法正在添加@Html.AntiForgeryToken()但这不是我的解决方案。

后来,我解决了另一个问题,“同源策略”:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ,这也是防止 CSRF 的解决方案吗?我不这么认为。

最佳答案

我的问题是我不想使用 MVC,而只想提供由 WebApi 支持的静态 html 文件。这是我所做的(这行得通吗?)创建一个 Http 模块,在提供任何静态文件时设置随机 cookie 值。例如:

public class XSRFModule : IHttpModule {
...

void context_EndRequest(object sender, EventArgs e) {
if (Path.GetExtension(HttpContext.Current.Request.Path) == ".html") {
HttpContext.Current.Response.Cookies.Add(new HttpCookie("XSRF-TOKEN", Guid.NewGuid().ToString()));
}
}
}

然后在您的 html 页面中,在调用您的 api 时使用 javascript 将 cookie 值添加到 header :
function callApi() {
xhr = new XMLHttpRequest();
xhr.open("GET", "api/data", true);
var regex = /\b(?:XSRF-TOKEN=)(.*?)(?=\s|$)/
var match = regex.exec(document.cookie);
xhr.setRequestHeader("X-XSRF-TOKEN", match[1]);
xhr.send();
}

最后,在您的 HttpModule ,在处理对您的 api 的任何调用之前检查 cookie 是否与 header 匹配:
void context_BeginRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Path.StartsWith("/api"))
{
string fromCookie = HttpContext.Current.Request.Cookies.Get("XSRF-TOKEN").Value;
string fromHeader = HttpContext.Current.Request.Headers["X-XSRF-TOKEN"];
if (fromCookie != fromHeader)
{
HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.Forbidden;
HttpContext.Current.Response.End();
}
}
}

您需要设置 HttpOnly标记为 FALSE以便您域中的 javascript 可以读取 cookie 并设置标题。我不是安全专家,所以我想从社区的其他一些成员那里得到一些关于这个解决方案的反馈。

编辑

如果您使用的是 OWIN,则可以使用全局操作过滤器和中间件插件:

启动.cs
app.UseStaticFiles(new StaticFileOptions {
OnPrepareResponse = (responseContext) => {
responseContext.OwinContext.Response.Cookies.Append("XSRF-TOKEN", Guid.NewGuid().ToString());
},
FileSystem = "wwwroot"
});

XsrfFilter.cs
public class XsrfFilter : ActionFilterAttribute {
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) {

string fromCookie = actionContext.Request.Headers.GetCookies("XSRF-TOKEN").FirstOrDefault()["XSRF-TOKEN"].Value;
string fromHeader = actionContext.Request.Headers.GetValues("X-XSRF-TOKEN").FirstOrDefault();

if (fromCookie == fromHeader) return;

actionContext.Response = new HttpResponseMessage(HttpStatusCode.OK);
actionContext.Response.ReasonPhrase = "bad request";
}
}

关于asp.net-web-api - 防伪 token + Web API (- MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224014/

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