7

ASP.NET MVC4 の非常に小さな層の上で、REST Web API と連携する AngularJS を使用して SPA アプリケーションを開発しています。ここでは重要ではない理由により、MVC4 のデフォルトの Account Controller は使用していません。

基本的には、ユーザー間で「タスク」を共有したい。私の目標は、特定の「タスク」エンティティの URL を電子メールで任意のユーザーに送信できるようにすることです。その URL をクリックすると、認証が開始されます。認証が成功した後、実際のタスク ページ情報を表示したいと考えています。

AngularJS が原因で URL に # 記号が付く、またはタスク「XYZ123」を表示するページの URL が http://hostname.com/#/tasks/XYZ123になる

ASP.NET は、その URL への不正アクセスを http://hostname.com/Home/Login?ReturnUrl=%2f#/tasks/XYZ123にリダイレクトします。

これは問題ありませんが、関連するコントローラー メソッドが # からパスを「切り取る」ため、次のようになります。

 public ActionResult Login(string returnUrl)

「returnUrl」の値は単に「/」になります

だから、私はパスを失っています: 元の URL を持つ「Connect with Facebook」リンクを作成したいと思います。

http://hostname.com/Login/ExternalLogin?ReturnUrl=%2F#/tasks/XYZ123

でもできないんです。

この問題を解決する正しい方法は何ですか?

# タグなしで独自のリダイレクト サービス URL を作成することも考えられますが、この解決策は追加の作業を意味し、システムがタスク URL を含むメッセージを送信している場合のみをカバーします。ブラウザ。

ヒントをありがとう。

マックス

4

3 に答える 3

3

はい。ブラウザは「#/tasks/XYZ123」を切り取り、そのハッシュなしでページをリクエストします。ハッシュ自体はログオン ページに表示されますが、これもブラウザの作業です。ハッシュがサーバーに移動していません。

したがって、ブラウザが ?ReturnUrl=%2f#/tasks/XYZ123 でログオン ページをロードすると、フォーム アクションを書き換えてハッシュをエンコードできます。

フォームが次のようになっている場合:

<form action="/Home/Login" method="post" >
    ...
</form>

JavaScript コードは次のようになります。

<script src="~/js/jquery.js"></script>

<script type="text/javascript">
    $(function() {

        var search = $(location).attr('search') || '';
        var hash = $(location).attr('hash') || '';

        if (hash.length === 0) {                
            if (window.history.pushState) {
                window.history.pushState('login', 'Login', '/Home/Login');
            }
        } else if (search === '?ReturnUrl=%2f') {
            $('form').attr('action', '/Home/Login' + search + encodeURIComponent(hash) );
        }

    });

</script>

window.history.pushStateの部分は、次の場合に必要です。

ハッシュがない場合、SPA の場合、その URL (より可能性が高い) は次のようになります。

http://hostname.com/Home/Login?ReturnUrl=%2f

そのため、ここでは (ページのリロードなしで) URL をより正確なものに置き換えようとしています

http://hostname.com/Home/Login
于 2016-02-02T11:18:48.890 に答える