У нас была такая же проблема, но необходимо для нашего валидатор продолжать строиться против 4.0, так что он может быть использован либо в 4.0 или 4.5 средах, поэтому мы не можем использовать решение, которое разместил Яп. Наше решение заключалось в том, чтобы пометить маркер в HttpContext.Items, чтобы сообщить нам, что проверка уже выполняется, так что, когда запускается вложенная проверка, мы можем просто позволить ей пройти.
public class WifRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
{
validationFailureIndex = 0;
if (requestValidationSource == RequestValidationSource.Form && collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal))
{
if(AlreadyValidating(context))
{
return true; // Allows us to bypass check that happens as a result of trying to use context.Request.Form
}
StartValidating(context);
if (IsWsFedSigninResponse(context))
{
return true;
}
EndValidating(context);
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
private static bool AlreadyValidating(HttpContext context)
{
return context.Items["__ApprendaRequestValidatorInProgress"] != null;
}
private static void StartValidating(HttpContext context)
{
context.Items["__ApprendaRequestValidatorInProgress"] = new object();
}
private static bool IsWsFedSigninResponse(HttpContext context)
{
return WSFederationMessage.CreateFromFormPost(context.Request) as SignInResponseMessage != null;
}
private static void EndValidating(HttpContext context)
{
context.Items["__ApprendaRequestValidatorInProgress"] = null;
}
}
Спасибо @Jaap, ваш ответ спас мой день.Мы столкнулись с переполнением стека в другом сценарии на сайте 4.0. Это происходило, если это был кешированный STS-url. Я изменил функцию, как указано выше, чтобы исправить ее. Единственным отличием от выше было способ получить объект неопределенной формы как Request.Unvalidated.Form не был напрямую доступен в 4.0. var unvalidatedRequestFormValues = System.Web.Helpers.Validation.Unvalidated (context.Request) .Form; – dreamerkumar
Для любого пользователя на .net 4.5, выйдите из ответа @klings, просто установите targetFramework в 4.5 в элементе httpRuntime вашего web.config. – ctb
@ctb, ответ королей тоже не работал на меня. У меня был аналогичный код, как указано выше, но он был для .Net 4.0, так же, как и Vishal. Мой код был перенесен на .Net 4.6 из .Net 4.0 и ответ здесь работал для меня. – ghanashyaml