Установите атрибут ValidateAntiForgeryToken для работы с условием - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть стандартный контроллер MVC с действием POST.Этот контроллер используется в общем проекте, который используется несколькими приложениями.Мы пытаемся добавить защиту CSRF в шахматном процессе выпуска, где мы добавляем защиту CSRF через маркер защиты от подделки для каждого приложения по одному.

Если я добавлю атрибут проверки, [ValidateAntiForgeryToken] для этого контроллера, ноВключите только скрытый элемент формы Anti Forgery Token в представления 1 приложения, это приведет к хаосу для других приложений.Как я могу применить этот атрибут на основе условия.Это возможно?Это нужно сделать вручную, как в коде ниже?Есть ли лучший способ?

    [HttpPost]
    public ActionResult GenericSection(string nextController, string nextAction, FormCollection form)
    {
        // Validate anti-forgery token if applicable
        if (SessionHandler.CurrentSection.IncludeAntiForgeryToken)
        {
            try
            {
                AntiForgery.Validate();
            }
            catch (Exception ex)
            {
                // Log error and throw exception
            }
        }

        // If successful continue on and do logic
    }

1 Ответ

0 голосов
/ 29 ноября 2018

Если вы украсили метод действия контроллера атрибутом ValidateAntiForgeryToken, вы не сможете выйти, не поместив скрытое поле в представление.

Вам нужно выяснить, где у вас есть атрибут ValidateAntiForgeryToken, где скрытое поле для токена в представлении, но проверка токена возможна только при необходимости.

Для приведенного нижеРешение, я предполагаю, что у нескольких приложений, о которых вы говорите, есть файл web.config.

Что вам нужно сделать, это ввести новую конфигурацию в appSettings, такую ​​как IsAntiForgeryTokenValidationEnabled или более короткое имя.

Создайте новый класс атрибутов, как показано ниже, и проверьте значение конфигурации.Если значение конфигурации - true, то можно проверить токен, в противном случае просто пропустите его.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class CheckAntiForgeryTokenValidation : FilterAttribute, IAuthorizationFilter
{
    private readonly IIdentityConfigManager _configManager = CastleClassFactory.Instance.Resolve<IIdentityConfigManager>();
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var configValue = System.Configuration.ConfigurationManager.AppSettings["IsAntiForgeryTokenValidationEnabled"];
        //Do not validate the token if the config value is not provided or it's value is not "true".
        if(string.IsNullOrEmpty(configValue) || configValue != "true")
        {
            return;
        }
        // Validate the token if the configuration value is "true".
        else
        {
            new ValidateAntiForgeryTokenAttribute().OnAuthorization(filterContext);
        }
    }
}

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

Теперь вам нужно использовать этот атрибут в методе действия контроллера, как в следующем примере.

public class HomeController : Controller
{
     [HttpPost]
     [CheckAntiForgeryTokenValidation]
     public ActionResult Save()
     {
         // Code of saving.
     }
}

После этого все приложения, которые хотят проверитьAntiForgeryToken должен иметь конфигурацию IsAntiForgeryTokenValidationEnabled в файле конфигурации со значением true.Проверка токена по умолчанию недоступна, поэтому, если существующие приложения не имеют конфигураций, они по-прежнему работают без проблем.

Надеюсь, это поможет вам решить вашу проблему.

...