Итак, давайте посмотрим, что делает ValidateAntiforgeryTokenAttribute (Reflector/ILSpy — ваш друг):
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
string antiForgeryTokenName = AntiForgeryData.GetAntiForgeryTokenName(null);
string antiForgeryTokenName2 = AntiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath);
HttpCookie httpCookie = filterContext.HttpContext.Request.Cookies[antiForgeryTokenName2];
if (httpCookie == null || string.IsNullOrEmpty(httpCookie.Value))
{
throw ValidateAntiForgeryTokenAttribute.CreateValidationException();
}
AntiForgeryData antiForgeryData = this.Serializer.Deserialize(httpCookie.Value);
string text = filterContext.HttpContext.Request.Form[antiForgeryTokenName];
if (string.IsNullOrEmpty(text))
{
throw ValidateAntiForgeryTokenAttribute.CreateValidationException();
}
AntiForgeryData antiForgeryData2 = this.Serializer.Deserialize(text);
if (!string.Equals(antiForgeryData.Value, antiForgeryData2.Value, StringComparison.Ordinal))
{
throw ValidateAntiForgeryTokenAttribute.CreateValidationException();
}
string username = AntiForgeryData.GetUsername(filterContext.HttpContext.User);
if (!string.Equals(antiForgeryData2.Username, username, StringComparison.OrdinalIgnoreCase))
{
throw ValidateAntiForgeryTokenAttribute.CreateValidationException();
}
if (!this.ValidateFormToken(antiForgeryData2))
{
throw ValidateAntiForgeryTokenAttribute.CreateValidationException();
}
}
Хорошо, очевидно, что имя файла cookie для токена создается из пути приложения:
string antiForgeryTokenName2 = AntiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath);
HttpCookie httpCookie = filterContext.HttpContext.Request.Cookies[antiForgeryTokenName2];
Итак, вы создаете свой собственный фильтр, просто копируете и вставляете этот код и меняете его так, чтобы он также учитывал порт (или что-то еще, по чему вы отличаете свои приложения):
string antiForgeryTokenName2 = AntiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath + filterContext.HttpContext.Request.Url.Port);
HttpCookie httpCookie = filterContext.HttpContext.Request.Cookies[antiForgeryTokenName2];
Таким образом, имя файла cookie («RequestVerificationToken_Lw») также будет зависеть от порта.
И, конечно же, мы не можем забыть изменить имя этого файла cookie при создании токена. К сожалению, вам нужно будет скопировать и вставить «повторно реализовать» здесь 2 вещи — сначала метод расширения AntiForgeryToken для вызова вашего собственного AntiForgeryWorker, а затем сам AntiForgeryWorker — просто переопределите метод GetAntiForgeryTokenAndSetCookie, это то же самое, что и раньше:
string antiForgeryTokenName = AntiForgeryData.GetAntiForgeryTokenName(httpContext.Request.ApplicationPath);
Ну, это кажется беспорядком, и это определенно не СУХОЕ решение, но если вы действительно этого хотите, вы можете сделать это за несколько минут. Просто используйте отражатель и скопируйте-вставьте :)
person
rouen
schedule
25.10.2011
intra.foo.com
иextra.foo.com
, которые решат ваши проблемы с файлами cookie? - person Darin Dimitrov   schedule 27.07.2011localhost:123
иlocalhost:456
, а затем запросить свои сайты с соответствующими доменными именами. - person Darin Dimitrov   schedule 27.07.2011