私は、ValidateAntiForgeryTokenのAjaxバージョンを再作成しようとしています。以前のバージョンのMVCではこれを行う方法についてのブログ記事は多数ありますが、最新のMVC 6ではコードは関連しています。ただし、Cookieをフォーム値と比較するのではなく、__RequestVerificationToken
のCookieとヘッダーを検証するようにしてください。私はMVC 6.0.0-rc1-final、dnx451フレームワークを使用しています。すべてのMicrosoft.Extensionsライブラリは1.0.0-rc1-finalです。AspNetコアMVCを使用したAjaxリクエストのValidateAntiForgeryToken
最初はValidateAntiForgeryTokenAttributeを継承していましたが、ソースコードを見て、ヘッダを見るために独自の実装を返す必要がありました。このように
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class ValidateAjaxAntiForgeryTokenAttribute : Attribute, IFilterFactory, IFilterMetadata, IOrderedFilter { public int Order { get; set; } public bool IsReusable => true; public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) { return serviceProvider.GetRequiredService<ValidateAjaxAntiforgeryTokenAuthorizationFilter>(); } }
、私はその後、ValidateAntiforgeryTokenAuthorizationFilter
public class ValidateAjaxAntiforgeryTokenAuthorizationFilter : IAsyncAuthorizationFilter, IAntiforgeryPolicy { private readonly IAntiforgery _antiforgery; private readonly ILogger _logger; public ValidateAjaxAntiforgeryTokenAuthorizationFilter(IAntiforgery antiforgery, ILoggerFactory loggerFactory) { if (antiforgery == null) { throw new ArgumentNullException(nameof(antiforgery)); } _antiforgery = antiforgery; _logger = loggerFactory.CreateLogger<ValidateAjaxAntiforgeryTokenAuthorizationFilter>(); } public async Task OnAuthorizationAsync(AuthorizationContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (IsClosestAntiforgeryPolicy(context.Filters) && ShouldValidate(context)) { try { await _antiforgery.ValidateRequestAsync(context.HttpContext); } catch (AjaxAntiforgeryValidationException exception) { _logger.LogInformation(1, string.Concat("Ajax Antiforgery token validation failed. ", exception.Message)); context.Result = new BadRequestResult(); } } } protected virtual bool ShouldValidate(AuthorizationContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } return true; } private bool IsClosestAntiforgeryPolicy(IList<IFilterMetadata> filters) { // Determine if this instance is the 'effective' antiforgery policy. for (var i = filters.Count - 1; i >= 0; i--) { var filter = filters[i]; if (filter is IAntiforgeryPolicy) { return object.ReferenceEquals(this, filter); } } Debug.Fail("The current instance should be in the list of filters."); return false; } }
の自分自身のバージョンを作ったしかし、私はIAntiforgeryPolicyが含まれている適切なNugetパッケージと名前空間を見つけることができません。私はGitHub上のインターフェースを見つけている間に、どのパッケージを見つけるのですか?
私の次の試みは、IAntiforgery注入の代わりに、DefaultAntiforgeryを私自身のAjaxAntiforgery
に置き換えました。
public class AjaxAntiforgery : DefaultAntiforgery { private readonly AntiforgeryOptions _options; private readonly IAntiforgeryTokenGenerator _tokenGenerator; private readonly IAntiforgeryTokenSerializer _tokenSerializer; private readonly IAntiforgeryTokenStore _tokenStore; private readonly ILogger<AjaxAntiforgery> _logger; public AjaxAntiforgery( IOptions<AntiforgeryOptions> antiforgeryOptionsAccessor, IAntiforgeryTokenGenerator tokenGenerator, IAntiforgeryTokenSerializer tokenSerializer, IAntiforgeryTokenStore tokenStore, ILoggerFactory loggerFactory) { _options = antiforgeryOptionsAccessor.Value; _tokenGenerator = tokenGenerator; _tokenSerializer = tokenSerializer; _tokenStore = tokenStore; _logger = loggerFactory.CreateLogger<AjaxAntiforgery>(); } }
私はCreateLogger<T>()
ためILoggerFactory
には、一般的な方法がないので、私はアウト失速はるか前にこれを得ました。 DefaultAntiforgery
のソースコードはMicrosoft.Extensions.Options
ですが、Nugetパッケージの名前空間は見つかりません。 Microsoft.Extensions.OptionsModel
が存在しますが、それはちょうどIOptions<out TOptions>
インターフェイスをもたらします。そしてアクションのみのために - 私は認証フィルターが動作し得るか、または私はIAntiforgery
の新しい実装を取得し、どこかどのように私はそれを使用する依存性注入とそれを登録しないと、このすべてをフォローアップする
私はAjax要求を受け入れるでしょうか?
コード例がありますか? – Grandizer