4

次のアプリケーションを含む 1 つのテスト Web サーバー

service.ganymedes.com:8008 - WCF RESTful サービス、基本的には WCF スターター キット プレビュー 2 の FormsAuth サンプル

mvc.ganymedes.com:8008 - ASP.NET MVC 2.0 アプリケーション

service.ganymedes.com の web.config:

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

mvc.ganymedes.com の web.config:

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

jQuery の $.ajax または getJson を介して GET (または POST) を試すと (Firebug によると)、Cookie が送信されないため、WCF サービスから HTTP 302 が返されます。

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>

または、サービスがまったくバインドされません。ブラウザーで直接 jQuery 呼び出しで使用するのと同じデータ URI を使用できます。ブラウザーは Cookie を送信し、WCF はデータを返します。サブドメイン間の呼び出しでそれを使用して、認証 Cookie を含めることはできないようです。

4

1 に答える 1

1

OK、これはセキュリティ (Same Origin Policy) による既知の制限だと思います。クロスドメインブロックについては知っていましたが、サブドメインは大丈夫だと思いました。

私は常に AJAX を意識した考え方で WCF と REST の調査 (および MVC を RESTful Web サービスとして使用) に約 2 週間を費やしましたが、これは概念実証の実装前に思いつきませんでした。図に行きます。

どうやら基本認証は、AJAX 経由でもサブドメイン間では機能しません。JSONP はフォーム認証/Cookie で動作するようですが、基本認証では動作しません (とにかく HTTP GET に限定したくありません...)。document.domain を変更しても、しゃがむことはありませんでした。

結局、すべてを同じドメインに配置するか、すべての呼び出しのリクエストパラメーターとして認証情報を手動で送信する必要があると思いますが、これらのソリューションはどちらもくだらない回避策のように感じます (そして、どちらも安全ではありません)。しかたがない。

私は今、ちょっとばかげていると感じています。

于 2010-05-25T12:30:06.417 に答える