Antiforgery.GetTokens бросает исключение - PullRequest
0 голосов
/ 28 января 2020

Я столкнулся с проблемой, которую просто не могу обернуть. Я настроил приложение asp. net (версия 4.7) MVC (фреймворк, а не ядро), которое частично MVC веб и в основном веб-API.

Часть MVC в основном предназначена для обслуживания Layout.cs html, содержащего клиент React. Остальное обрабатывается веб-API и использует OWIN Cook ie аутентификацию. До сих пор все работало нормально, пока я не наткнулся на создание токенов Antiforgery. У клиента есть форма. Когда клиент запрашивает данные начальной формы из API, я устанавливаю дополнительный заголовок ответа с сгенерированным токеном CSRF. Это происходит внутри действия API. Примерно так:

[Authorize]
public class ProductsController : ApiController
{
     ...
     [HttpGet]
     public IEnumerable<FormValues> GetFormValues() { 
        string cookie, formToken;
        Antiforgery.GetTokens(null, out cookie, out formToken);
        HttpContext.Current.Response.AppendHeader("X-TOKEN", $"{cookie}:{formToken}")
        return someFormValues;
     }

}

Идея в том, чтобы отправить сгенерированный токен в качестве заголовка. Клиент будет использовать это позже в запросе POST, добавив его в заголовок запроса.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда я делаю перезапуск на своем AppPool (IIS) и выполняю вход в систему ( генерируя новый auth cook ie), когда я запрашиваю вышеуказанное действие, Antiforgery.GetTokens () выдает исключение.

Исключения не ясны, но оно исходит от Анти-фальсификаций, предполагающих, что он не может разрешить одну из своих зависимостей.

Странно то, что генерация токенов работает гладко, как только GET API выше разрешен для анонимные пользователи.

Еще более странным является то, что если я добавлю следующий скрипт в мой layout.cs html (бритва)

<script>
    @functions{
    public string TokenHeaderValue() {
        string cookieToken, formToken;
        AntiForgery.GetTokens(null, out cookieToken, out formToken);
        return cookieToken + ":" + formToken; 
    }
}
</script>

и использую его в моем javascript, то GetTokens внутри действие работает как надо, не вызывая исключения.

Я могу попытаться опубликовать все исключение, если это необходимо, но я надеялся, что у кого-нибудь есть хорошее представление о том, как работает класс Antiforgery, который может помочь мне объяснить это поведение.

ОБНОВЛЕНИЕ: Ниже приведено исключение, которое возникает при запуске GetTokens внутри действия веб-API после сброса iis:

The type initialization for System.Web.Helpers.Claims.ClaimsIdentityConverter 
caused an exception

Could not load file or assembly 'Microsoft.IdentityModel, Version=3.5.0.0'
...