1. ホーム
  2. asp.net-mvc

Web APIとValidateAntiForgeryToken

2023-10-16 01:54:17

質問

私たちは、Web ページから AJAX スタイルと呼ばれるいくつかの既存の MVC Web サービスを持っています。 これらのサービスは、リクエストの偽造を防ぐために ValidateAntiForgeryToken 属性を使用しています。

私たちはこれらのサービスを Web API に移行しようとしていますが、同等の偽造防止機能はないように思われます。

私は何かを見逃しているのでしょうか? Web APIでリクエストフォージェリーに対処するための別のアプローチがあるのでしょうか?

どのように解決するのですか?

このようなauthorization属性を実装すればよいでしょう。

[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);
}