2015-06-07 3 views
6

Я пытаюсь выполнить авторизацию на кириллическом домене с помощью WebClient. Авторизация проходит через несколько этапов с переадресацией между нормальным и punicode доменами. Проблема заключается в том, что HttpWebRequest не может хранить файлы cookie в назначенном CookieContaier, если он был установлен доменом punycode. Например, этот код будет вызывать CookieException.CookieContainer не хранит файлы cookie для интернационализированных доменных имен

var cookie = new Cookie("test_cookie", "test_value", "/", ".xn----7sbcca6bi0ak9b0a6f.xn--p1ai"); 
var container = new CookieContainer().Add(cookie); 

Проблема усугубляется тем фактом, что ответ, который устанавливает куки перенаправляет на другую страницу, то есть после того, как WebClient.UploadValues ​​(...) были выполнены нет никакой информации куки в WebClient.ResponseHeaders.

Ниже нормальный процесс авторизации (с помощью браузера)

Method Result Received Type  URL              RedirectURL            Set-Cookie                                 
POST 302  1,18 K text/html http://xn----7sbcca6bi0ak9b0a6f.xn--p1ai/admin/login  http://xn----7sbcca6bi0ak9b0a6f.xn--p1ai/admin    sess_id=.......; expires=Mon, 06-Jun-2016 07:20:57 GMT; Max-Age=31536000; path=/; domain=.xn----7sbcca6bi0ak9b0a6f.xn--p1ai; httponly  
GET  302  722  text/html http://xn----7sbcca6bi0ak9b0a6f.xn--p1ai/admin    /admin/orders                                               
GET  200  200,00 K text/html http://xn----7sbcca6bi0ak9b0a6f.xn--p1ai/admin/orders                                                    

Есть ли обходной путь?

+0

Может ли кто-нибудь подтвердить, что это ошибка? Может быть, я должен сообщить об этом на https://connect.microsoft.com/VisualStudio/? – Leff

+0

Обновление: 1. Обработка IDN и IRI должна быть включена в конфигурации для воспроизведения описанного выше поведения. 2. Очевидно, что причиной проблемы является внутренний метод 'VerifySetDefaults' класса' System.Net.Cookie'. Я пытаюсь понять, почему, но 'VerifySetDefaults' довольно сложный для меня. – Leff

+0

Обновление: Кажется, что 'VerifySetDefaults' пытается сравнить IDN с его представлением punycode, когда он не выполняется, исключение вызывается. – Leff

ответ

1

Вы уверены, что проблема с IDN?

Следующий фрагмент кода (который является таким же, как у вас, но вторая линия разделена, чтобы сделать его компиляции)

var cookie = new Cookie("test_cookie", "test_value", "/", ".xn----7sbcca6bi0ak9b0a6f.xn--p1ai"); 
var container = new CookieContainer(); 
container.Add(cookie); 

container.GetCookies(new Uri("http://test.xn----7sbcca6bi0ak9b0a6f.xn--p1ai")).Dump(); 

не бросает CookieException на всех (бегите от LINQPad). Может ли проблема быть в названии и/или значении, которое вы пытаетесь установить для файла cookie? Какое точное сообщение вы получаете из CookieException?

+0

Это определенно проблема IDN, потому что обычные файлы cookie домена хранятся хорошо. Ваш фрагмент кода генерирует исключение в .net fw 4.5.1. Какую версию вы использовали для тестирования? – Leff

+0

! [Скриншот] (http://s017.radikal.ru/i433/1506/2f/7c13166ab19f.png) – Leff

+0

Запуск 4.0.30319.34014, который является .NET 4.5.1 на Windows 8.1 64-bit. –