asp.net-mvc - Web API 和 ValidateAntiForgeryToken

标签 asp.net-mvc asp.net-web-api antiforgerytoken

我们有一些现有的 MVC Web 服务,它们在网页中称为 AJAX 样式。这些服务利用 ValidateAntiForgeryToken 属性来帮助防止请求伪造。

我们正在寻求将这些服务迁移到 Web API,但似乎没有等效的防伪功能。

我错过了什么吗?是否有不同的方法来解决 Web API 请求伪造问题?

最佳答案

您可以实现这样的授权属性:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public sealed class ValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
    public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    {
        try
        {
            AntiForgery.Validate();
        }
        catch
        {
            actionContext.Response = new HttpResponseMessage 
            { 
                StatusCode = HttpStatusCode.Forbidden, 
                RequestMessage = actionContext.ControllerContext.Request 
            };
            return FromResult(actionContext.Response);
        }
        return continuation();
    }

    private Task<HttpResponseMessage> FromResult(HttpResponseMessage result)
    {
        var source = new TaskCompletionSource<HttpResponseMessage>();
        source.SetResult(result);
        return source.Task;
    }
}

然后用它来装饰您的 API 操作:

[ValidateAntiForgeryToken]
public HttpResponseMessage Post()
{
    // some work
    return Request.CreateResponse(HttpStatusCode.Accepted);
}

关于asp.net-mvc - Web API 和 ValidateAntiForgeryToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11476883/

相关文章:

asp.net-mvc - 为什么我不能在 ASP.NET View 中设置断点?

asp.net - 在具有相同名称的不同 namespace 中招摇不同的类不起作用

c# - 为同一操作 MVC5 将 ValidateAntiForgeryToken 属性设置为 GET/POST

asp.net - 如何验证客户端是否启用了 ViewStateUserKey?

ajax - 将 antiforgerytoken 放在 _Layout.cshtml 中是否有意义?

asp.net-mvc - HttpResponseMessage 内容不会显示 PDF

asp.net-mvc - Asp.Net Mvc 路由约束可以抛出 404 而不是 InvalidOperationException 吗?

c# - Ninject 和依赖注入(inject) WebApi 属性

c# - 将从 ToString ("MMMM") 返回的月份名称更改为自己的名称

asp.net - 已将 'multipart/form-data' 上传到 ASP.NET Web API 操作,在无缓冲模式下不可读