1

昔は:

Response.Redirect を使用しました。これは、302 応答ヘッダーを設定し、ThreadAbortException を発生させて、リダイレクト後に他のことが起こらないようにします。

今、MVCで:

RedirectResult を返します。これにより、ThreadAbortException によるパフォーマンスの問題が回避され、パイプラインの残りの部分が実際にブラウザーに結果を返す前に結果を検査できるようになります。これはリダイレクトについての別の考え方です。現在、リダイレクトは実行を停止するのではなく、関数から戻ることに似ています。

私の質問は、これらのパターンの混合と一致に関係しています。

これが要件です。MVC サイトがあり、サイトには認証を担当する HttpModule が含まれています。認証に問題が発生すると、Cookie が削除され、外部Web ページにリダイレクトされます。したがって、HttpModule は、リダイレクト ヘッダーを送信するか、コントロールを MVC サイトに渡すかを決定します。リダイレクト ヘッダーを送信する場合は、実行を停止する必要があります。認証に失敗した場合、どのような方法、形状、または形式でもサイトにアクセスできないようにする必要があります。

これを行う「正しい」方法は何ですか?いつものように、HttpModule は単純に Response.Redirect を使用する必要がありますか? それとも、MVC パターンとより一貫性のあるこれを達成するための巧妙な方法はありますか? HttpModule がパイプラインに処理を停止するように指示する方法はありますか?

または、HttpModule を使用しない、まったく異なるパターンを使用する必要がありますか? おそらくMVCフィルターですか?問題は、モジュールとサイト自体の間のモジュール性/関心の分離が非常に重要であるということです。誰にもお勧めはありますか?

4

2 に答える 2

2

他の誰かが同様の問題ドメインで質問をした場合に備えて、ここに答えを投げると思いました。

答えは実際には非常に簡単です。

HttpContext.ApplicationInstance.CompleteRequest()

上記の呼び出しは ThreadAbortException (これは .NET 2.0 で変更されました) をスローしなくなりました。そのため、これを安全に使用して、パイプラインに実行を停止するように指示できます。HttpModule が終了すると、適切な Web サイトはバイパスされ、制御は EndRequest に直接渡されます。まさに私が必要としていたものです。これは .NET 1.1 では不可能でしたが、1.1 MVC プロジェクトはあまりないと思います ;)

于 2013-04-14T07:59:54.447 に答える
1

これは認証用であると述べたので、 Authorize Attributeを使用する必要があります。クラス レベルまたはアクション レベルで使用できます。

[Authorize]
public class HomeController : Controller
{
    // All actions will require authorization
}

public class ImageController : Controller
{
    public ActionResult PublicImage()
    {
    }

    [Authorize]
    public ActionResult ImageRequiringAuth()
    {
    }
}

この回答で説明されているように、ユース ケースでは、AuthorizationAttribute から継承する必要がある場合があります。

于 2013-04-13T11:19:50.333 に答える