Проверка подлинности с помощью форм, служба ASP.NET MVC и WCF RESTful - PullRequest
4 голосов
/ 24 мая 2010

Один тестовый веб-сервер со следующими приложениями

service.ganymedes.com: 8008 - WCF RESTful-сервис, в основном образец FormsAuth из WCF Starter Kit Preview 2

mvc.ganymedes.com: 8008 - приложение ASP.NET MVC 2.0

web.config для service.ganymedes.com:

<authentication mode="Forms">
    <forms loginUrl="~/login.aspx" timeout="2880" domain="ganymedes.com" name="GANYMEDES_COOKIE" path="/" />
</authentication>

web.config для mvc.ganymedes.com:

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn" timeout="2880" domain="ganymedes.com" name="GANYMEDES_COOKIE" path="/" />
</authentication>

Из-за того, что я стараюсь изо всех сил, GET (или POST) через $ .ajax или getJson jQuery не отправляет мой cookie (согласно Firebug), поэтому я получаю HTTP 302, возвращенный из службы WCF:

Request Headers
Host               service.ganymedes.com:8008
User-Agent       Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)
Accept           application/json, text/javascript, */*
Accept-Language    en-us,en;q=0.5
Accept-Encoding    gzip,deflate
Accept-Charset     ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive       300
Connection       keep-alive
Referer         http://mvc.ganymedes.com:8008/Test
Origin           http://mvc.ganymedes.com:8008

Он отправляется, когда копается на сайте MVC, хотя:

Request Headers
Host               mvc.ganymedes.com:8008
User-Agent       Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729)
Accept           text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset   ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive       300
Connection       keep-alive
Referer         http://mvc.ganymedes.com:8008/Test
Cookie           GANYMEDES_COOKIE=0106A4A666C8C615FBFA9811E9A6C5219C277D625C04E54122D881A601CD0E00C10AF481CB21FAED544FAF4E9B50C59CDE2385644BBF01DDD4F211FE7EE8FAC2; GANYMEDES_COOKIE=D6569887B7C5B67EFE09079DD59A07A98311D7879817C382D79947AE62B5508008C2B2D2112DCFCE5B8D4C61D45A109E61BBA637FD30315C2D8353E8DDFD4309

Я также поместил одни и те же настройки в файлы web.config обоих приложений (самостоятельно созданные validationKey и decryptionKey).

В конфигурации привязки WCF пример FormsAuth не имеет явного элемента <bindings>, но я добавил это:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
        <baseAddressPrefixFilters>
            <add prefix="http://service.ganymedes.com:8008" />
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>    
</system.serviceModel>

или служба вообще не будет привязана. Я могу использовать тот же URI данных, что и в вызове jQuery, прямо в браузере, он отправит cookie, а WCF вернет данные. Кажется, я просто не могу использовать его в кросс-доменном вызове и включить cookie-файл auth.

1 Ответ

1 голос
/ 25 мая 2010

ОК, я думаю, это известное ограничение из-за безопасности (Same Origin Policy). Я знал о междоменных блоках, но думал, что для поддоменов все будет в порядке.

Я провел около 2 недель, исследуя WCF и REST (и используя MVC в качестве веб-сервиса RESTful), всегда с AJAX-ориентированным мышлением, и это никогда не приходило в голову до времени реализации концепции. Пойди разберись.

Очевидно, что обычная проверка подлинности не будет работать в поддоменах через AJAX. Кажется, JSONP будет работать с аутентификацией форм / cookie-файлами, но не будет работать с базовой аутентификацией (я все равно не хочу ограничиваться HTTP GET ...). Изменение document.domain не помогло мне приседать.

Полагаю, мне все-таки нужно поместить все в один и тот же домен или вручную отправлять информацию аутентификации в качестве параметров запроса для каждого вызова, но оба эти решения кажутся дурацкими обходными путями (и это, конечно же, не слишком безопасно). Ну что ж.

Теперь я чувствую себя немного глупо.

...