AntiForgeryToken Чистая страница истечения срока действия - PullRequest
10 голосов
/ 24 мая 2019

Я использую IdentityServer4 с ASP.NET Core 2.2.В методе Post Login я применил ValidateAntiForgeryToken.Обычно после 20 минут или 2 часов сидения на странице входа в систему, а затем попытки входа в систему, она создает пустую страницу.

Если вы посмотрите на Консоль почтальона, вы получите сообщение 400 Bad Request.Затем я установил срок действия файлов cookie для параметров AntiForgery на 90 дней.Я был в состоянии позволить странице сидеть до 6 часов и все еще входить в систему.Однако примерно через 8 часов (в одночасье) я снова получил пустую страницу после попытки входа в систему.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login
services.AddAntiforgery(options =>
{
    options.Cookie.Expiration = TimeSpan.FromDays(90);
});

Я ожидаю, что смогу просидеть на странице входа в течение 90 дней, что являетсяпродолжительность куки, но это не работает.Как получить cookie-файл для AntiforgeryToken, который будет длиться целых 90 дней или в любое другое время, когда я его установил, а не по тайм-ауту или истечению?Есть ли способ отловить эту ошибку и перенаправить пользователя обратно к методу входа?

Ответы [ 2 ]

4 голосов
/ 30 мая 2019

Еще одна реализация, использующая стандартную, включая все предварительные проверки, ведение журналов и т. Д. И это все еще AuthorizationFilter, так что предотвращает любое дальнейшее выполнение действия. Единственное отличие состоит в том, что он запускает HttpGet по тому же URL-адресу вместо ответа по умолчанию 400, что является своего рода реализацией шаблона Post / Redirect / Get .

public class AnotherAntiForgeryTokenAttribute : TypeFilterAttribute
{
    public AnotherAntiForgeryTokenAttribute() : base(typeof(AnotherAntiforgeryFilter))
    {
    }
}


public class AnotherAntiforgeryFilter:ValidateAntiforgeryTokenAuthorizationFilter,
    IAsyncAuthorizationFilter
{
    public AnotherAntiforgeryFilter(IAntiforgery a, ILoggerFactory l) : base(a, l)
    {
    }

    async Task IAsyncAuthorizationFilter.OnAuthorizationAsync(
        AuthorizationFilterContext ctx)
    {
        await base.OnAuthorizationAsync(ctx);

        if (ctx.Result is IAntiforgeryValidationFailedResult)
        {
            // the next four rows are optional, just illustrating a way
            // to save some sensitive data such as initial query
            // the form has to support that
            var request = ctx.HttpContext.Request;
            var url = request.Path.ToUriComponent();
            if (request.Form?["ReturnUrl"].Count > 0)
                url = $"{url}?ReturnUrl={Uri.EscapeDataString(request.Form?["ReturnUrl"])}";

            // and the following is the only real customization
            ctx.Result = new LocalRedirectResult(url);
        }
    }
}
4 голосов
/ 30 мая 2019

Это было мое окончательное решение.Я добавил атрибут, используя внедрение зависимостей IAntifogery.

public class CustomValidationAttribute : ActionFilterAttribute
{
    private IAntiforgery _antiForgery { get; }

    public CustomValidationAttribute(IAntiforgery antiforgery)
    {
        _antiForgery = antiforgery;
    }

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var isRequestValid = await this._antiForgery.IsRequestValidAsync(context.HttpContext);
        if (!isRequestValid)
        {
            //Add Code here if token is not valid

            return;         
        }

        await next();
    }
}

Добавьте атрибут в методы вашего контроллера, которые также используют [HttpPost]

[TypeFilter(typeof(CustomValidationAttribute))]
...