3

ASP.NET MVC4 サブ Web アプリケーションを既存の ASP.NET WebForm Web サイトに追加しました。ウェブサイト全体が使用してforms authenticationいます。

私の MVC4 クライアント側ではBackbone.js、アプリケーションの構築に使用していますが、クライアント アプリケーションはおそらく SPA です。

すべて正常に動作しますが、セッションがタイムアウトした後、アプリケーションがログイン ページにリダイレクトされません。

Collection.fetch メソッドでエラー コールバックを試しましたが、セッション タイムアウト後にフェッチしようとしたときにトリガーされました (これは良いことです)。

ただし、応答ステータス コードは 200 (OK) で、応答コンテンツはログイン ページのコンテンツです。

それで、私の質問は、エラーハンドラーで、コールバックがセッションタイムアウトまたはその他の予期しないエラーによってトリガーされたかどうかをどのように知ることができますか?

決定した場合、バックボーンが現在のページを参照しながらページをログイン ページにリダイレクトできるようにするにはどうすればよいですか?

4

1 に答える 1

2

これがPhilHaackがブログに書いたものです

投稿からの抜粋:

可能な解決策

Webで見たいくつかの可能な解決策を取り上げてから、私が好む解決策を紹介します。これらの他の解決策が間違っているわけではありませんが、場合によっては正しいだけです。

フォーム認証を削除する

FormsAuthが必要ない場合、この投稿が示唆するように、1つの簡単な解決策はフォーム認証モジュールを削除することです。これは、ASP.NETを使用してWeb APIサービスをホストすることが唯一の目的であり、フォーム認証を必要としない場合に最適なソリューションです。ただし、アプリがWebアプリケーションとWebサービスの両方である場合、これは優れたソリューションではありません。

HttpModuleを登録して、リダイレクトを401に変換します

このブログ投稿では、302リクエストを401に変換するHTTPモジュールの登録を提案しています。このアプローチには2つの問題があります。1つ目は、リダイレクトが正当であり、FormsAuthの結果ではない場合を破ることです。2つ目は、HttpModuleを手動で構成する必要があることです。

Install-Package MembershipService.Mvc

私の同僚であるSteveSandersonは、彼のMembershipService.MvcパッケージとMembershipService.WebFormsNuGetパッケージを使用してさらに優れたアプローチを採用しています。これらのパッケージは、ASP.NETメンバーシップを複数のデバイスから呼び出すことができるサービスとして公開します。

このブログのコメントからのいくつかのより多くの情報

同じ問題がありました。しかし、私たちが行ったことは、AuthenticateRequestにフックすることでした(あなたが行ったように)。また、リクエストがajaxであるかどうかを確認しました(これも、あなたが行ったように)。しかし、この時点で、のようなJSONを返し、{location: 'http://www.domain.com/path-to-login-page'}HTTPコード200を使用してそのメソッドの応答を終了しました。このようにして、jQueryは引き続きJSONの結果を取得します。ただし、結果に「location」プロパティがある場合は、クライアント側でログインページにリダイレクトするだけです。それが私たちのやり方であり、それは魅力のように機能します。

于 2012-11-12T06:56:25.007 に答える