Или, чтобы избежать изменения slowFunc
(например, у вас нет доступа к исходному коду, например):
var source = new CancellationTokenSource(); //original code
source.Token.Register(CancelNotification); //original code
source.CancelAfter(TimeSpan.FromSeconds(1)); //original code
var completionSource = new TaskCompletionSource
Вы также можете использовать красивые методы расширения из https://github.com/StephenCleary/AsyncEx и выглядит так просто:
await Task.WhenAny(task, source.Token.AsTask());
Если Вы знаете, что собираетесь нуждаться в маркере CSRF для запросов Ajax, можно всегда встраивать его в HTML где-нибудь; тогда можно найти его через JavaScript путем пересечения DOM. Таким образом, у Вас все еще будет доступ к маркеру, но Вы не представляете его через API.
Для помещения его иначе: сделайте это через шаблоны Django - не через диспетчера URL. Это намного более безопасно этот путь.
Отмена, что, я был неправ. (См. комментарии.) можно предотвратить использование путем обеспечения, что JSON следует за спецификацией: Всегда удостоверяйтесь, что Вы возвращаете литерал объектов как объект верхнего уровня. (Я не могу гарантировать, что не будет дальнейшего использования. Вообразите доступ обеспечения браузера к неудавшемуся коду в его window.onerror событиях!)
Вы не можете полагаться на правила перекрестных сценариев сайта сохранить ответы Ajax частными. Например, при возврате маркера CSRF как JSON злонамеренный сайт мог переопределять Строку или Конструктора Array и запрашивать ресурс.
bigmattyh корректен: необходимо встроить маркер где-нибудь в разметку. С другой стороны, Вы могли отклонить любые СООБЩЕНИЯ, которые делают , имеют ссылающийся домен, который не делает соответствие. Тот путь, только люди с фанатичными программными брандмауэрами будут уязвимы для CSRF.
ОБНОВЛЕНИЕ : ниже было верно, и должен быть верным, если все браузеры и плагины были правильно реализованы. К сожалению, мы теперь знаем, что они не, и что определенные комбинации плагинов браузера и перенаправлений могут позволить взломщику предоставлять произвольные заголовки по междоменному запросу. К сожалению, это означает, что даже Ajax запрашивает с "X-Requested-With: XMLHttpRequest" заголовок должен теперь быть CSRF-защищен. В результате Django больше не освобождает запросы Ajax от защиты CSRF .
Исходный Ответ
стоит упомянуть, что защита запросов Ajax от CSRF является ненужной, так как браузеры не позволяют запросы Ajax перекрестного сайта. На самом деле промежуточное программное обеспечение Django CSRF теперь автоматически освобождает запросы Ajax от маркера CSRF, сканируя .
Это только допустимо при фактической проверке серверной стороны заголовка X-Requested-With на значение "XMLHttpRequest" (который Django делает), и только освобождение реальных запросов Ajax от сканирования CSRF.