6

いくつかの Web アプリケーション認証プロトコル (WS-Federation や SAML プロトコル、いわゆる「パッシブ」プロトコル、および明らかに ASP.NET フォーム認証も同様です。この StackOverflow questionを参照してください。AppEngine は、この GWT バグ コメントを参照してください)元の「URL フラグメント」、つまり # 記号の後の部分。

おおよそ次のようになります: クリーンなブラウザー (キャッシュされた情報/クッキー/ログイン情報はありません) で、URL (1) http://example.com/myapp/somepage?some=parameter#somewhereを開きます。これにより、ブラウザー リクエスト (2) http://example.com/myapp/somepage?some=parameterが作成され、サーバーが ID プロバイダー (認証リクエストに URL (2) を含む) にリダイレクトし、最終的にリダイレクトされます。元の場所に戻ります。これは URL (2) です。サーバーが認識している唯一の URL です。しかし、私は URL (1) に行きたかったのですが、URL フラグメント (「アンカー」) は途中で失われてしまいました。実際には、最初のステップですでにです。

サーバーは URL フラグメントをまったく認識しないため、これはこれらのプロトコルの根本的な制限のようです。

(1) に移動すると、ブラウザーがサーバーから (2) を要求する仕様によると、SAML プロトコル、WS-Federation などでこのフラグメント損失制限が発生することがわかっています。この制限を回避できますか?

明らかな回避策は、この回答で提案されているように、URL フラグメントを避けることです。ただし、特定の Web アプリケーションの場合は、シングルページ GWT アプリケーションでブックマーク可能な URL フラグメントを使用して、アプリケーション内のナビゲーションによってページがリロードされないようにするため、適切ではありません。

私の質問: この状況には、他にどのような回避策または標準パターンがありますか?

(特に GWT + SAML プロトコル ソリューションに興味があります。)

4

2 に答える 2

0

RFC 1738によると、クライアントはリソースを要求するときにアンカー タグをサーバーに送信しません。

アンカー タグは、サーバー上の別のリソースではなく、リソース内の場所を識別するために使用されます。リソース内の場所を特定するために、クライアントはサーバーから完全なリソースを取得する必要があります。このプロセスでは、フラグメントに関する情報の転送は必要ありません (サーバーにとっては何の意味もないため)。

フラグメント文字 (#) をサーバーに送信する場合は、クエリ文字列でエンコードする必要があります。そうしないと、クライアント (ブラウザー) は、要求をサーバーに送信するときに URL のそのセクションを単純に無視します。サーバ。

編集:

実際の解決策はわかりませんが、サーバーはアンカーについて何も知らないため、この問題を回避するには、完全なリターン URL (アンカー タグを含む) をクライアント側のどこかに保存する必要があります。そのために、SessionStorage ( http://www.w3schools.com/html/html5_webstorage.asp ) を使用して、ログイン プロセスが完了するまで ReturnUrl を一時的に保存できます。古いブラウザー (<= IE7 など) ではサポートされないことに注意してください。

その場合、回避策は次のようになります。

<script>
    if(typeof(sessionStorage) == 'undefined')
    {
        sessionStorage = {
            getItem: function(){},
            setItem: function(){}
        };
    }

    window.onload = function ()
    {
        var key = 'ReturnUrl';

        //try to get last returnUrl with anchors
        var returnUrl = sessionStorage.getItem(key);

        //if we got something, do the navigation
        if(returnUrl !== undefined && returnUrl !== document.URL)
        {
            //clean it up
            sessionStorage.setItem(key, null);
            //navigate to last URL
            window.location = returnUrl;
        }
        else
        {
            //store url 
            sessionStorage.setItem(key, document.URL);
        }
    }
</script>

PS。頭のてっぺんから書き留めて試していないので、構文エラーがある場合はご容赦ください。

于 2013-12-11T15:11:24.067 に答える