. net core - Анти-фальсификация обработки исключений - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь обработать исключения противодействия на клиенте и хочу показать пользователям соответствующее сообщение, но все, что я получаю. Net Главный сервер - это 400 Bad Request ответ, поэтому я пытаюсь переопределить это своим собственным ответом.

Поэтому я добавил фильтр:

using Microsoft.AspNetCore.Mvc.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Website.Filters
{
    public class RedirectAntiforgeryValidationFailedResultFilter : IAlwaysRunResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            if (context.Result is IAntiforgeryValidationFailedResult result)
            {
                [overraid response]
            }
        }

        public void OnResultExecuted(ResultExecutedContext context)
        {            
            if (context.Result is IAntiforgeryValidationFailedResult result)
            {
                [overraid response]
            }
        }
    }
}

и на startup.cs

services.AddAntiforgery(options =>
        {
                options.SuppressXFrameOptionsHeader = true;
                options.HeaderName = "......";
                options.Cookie.Name = ".....";
                options.Cookie.Path = "/";
                options.Cookie.Expiration = TimeSpan.FromDays(2);
       });

services.AddMvc(options =>
                options.Filters.Add<RedirectAntiforgeryValidationFailedResultFilter>()
                ).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

Я использую эта функция для установки токена защиты от подделки для пользователей

private static void SetToken(HttpContext context, IAntiforgery antiforgery)
{
    var tokens = antiforgery.GetAndStoreTokens(context);
    context.Response.Cookies.Append("....", tokens.RequestToken, new CookieOptions()
    {
        HttpOnly = false,
        Secure = true,
        MaxAge = TimeSpan.FromDays(2),
        SameSite = SameSiteMode.Strict
    });
}

Мне так и не удалось получить [ответ с перегрузкой].

Вы можете увидеть ниже Изображение, что результатом является действительно AntiforgeryValidationFailedResult и все еще не может go внутри условия. enter image description here

1 Ответ

0 голосов
/ 14 апреля 2020

При использовании атрибута [ApiController] MVC преобразует результат ошибки (результат с кодом состояния 400 или выше) в результат с ProblemDetails . Тип ProblemDetails основан на спецификации RF C 7807 для предоставления машиночитаемых сведений об ошибках в ответе HTTP. Вы можете прочитать больше об этом здесь .

, поэтому для решения этой проблемы мне пришлось подавить ошибки клиента карты.

services.AddMvc(options => 
                options.Filters.Add<RedirectAntiforgeryValidationFailedResultFilter>())
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .ConfigureApiBehaviorOptions(options =>
                {
                    options.SuppressMapClientErrors = true;
                });
...