ihttpmoduleでのアクセスセッションとrespons.redirectを実行できる

StackOverflow https://stackoverflow.com/questions/2655116

  •  27-09-2019
  •  | 
  •  

質問

で見つかったソリューションに従います httpmoduleからセッション状態にアクセスできますか?, 、ihttpmoduleからセッション状態にアクセスできます。いくつかのファイルへのアクセスを制御するためにそれを使用しているので、誰かがアクセスできない場合は、ログインページにリダイレクトしたいと思います。 httpcontext.current.response.redirect(page)を実行しようとするとき; Webサーバーをロックします。だから私の投稿はリクエストの状態関数のように見えます...

 void Application_PostAcquireRequestState(object source, EventArgs e)
    {            
        HttpApplication app = (HttpApplication)source;

        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

        if (resourceHttpHandler != null)
        {
            // set the original handler back
            HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
        }

        HttpContext context = HttpContext.Current;
        string filePath = context.Request.FilePath;
        context.Trace.Write("HttpDownloadModule", "File path: " + filePath);

        Boolean hasAccess = true;

        if (filePath.Contains("content/downloads"))
        {
            //check to make sure a session has been established already....
            if (context.Session == null)
                hasAccess = false;

            SecurityBLL security = new SecurityBLL();
            string fileName = filePath.Split('/').Last();

            //check to see if a user is logged in
            if (!CitrixAccess.loggedin)
                hasAccess = false;

            //check access for download
            if (!security.checkSecurityByDownload(fileName))
                hasAccess = false;

            if (!hasAccess)
            {
                HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
                HttpContext.Current.Response.Redirect("../../login.aspx");
            }
        }

    }

何かご意見は?助けてくれてありがとう!

役に立ちましたか?

解決

さて、回避策を見つけました... HasAccess変数をグローバルに移動し、エンドレクエストハンドラーを追加しました。そこで、私はエンドリケストのhasAccessをチェックし、そこからリダイレクトを行っています。

他のヒント

私の答えには含まれています Arthurdent510の答え しかし、私は彼の答えについて単にコメントするのに十分な評判を持っていません。彼の答えは、私がどこに行かなければならないかを理解するのに多くのことを助けましたが、それは私にとって完全にはありませんでした。

Response.redirectコールをEndRequestハンドラーに配置すると、無限のループが発生しました。これは、Response.redirectがEndRequestを呼び出すためだと思います。そのため、EndRequestは何度も何度も呼ばれていました。

これを回避するために、私はすでにリダイレクトを求めているかどうかを示すためにプライベートブール値を追加しました。すでにリダイレクトを求めた場合、respons.redirectを再び呼び出すことはありません。これは私のエンドリケストの方法がどのように見えたかです:

Private Sub Application_EndRequest(ByVal source As Object, ByVal e As EventArgs)
    If Not _blnHasAccess AndAlso Not _blnRedirected Then
        _blnRedirected = True
        HttpContext.Current.Response.Redirect("~/Error.aspx")
    End If
End Sub
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top