2009-07-31 19 views
1

の問題は、私は多言語サイトのURLを書き換えるためにHttpModuleをを使用しています。 HttpModuleでは、BeginRequestイベントのハンドラを追加し、カルチャ名を含むパスの最初の部分を探します。.NET URLは、フォーム認証とloginUrl

は、例えば、/fr-ca/index.aspxは、これが正常に動作します3084.にスレッドの文化やUIの文化を/index.aspxして設定する書き換えられます。

は、フォーム認証を入力します。フォーム認証はマップされていないURLでも正常に動作しますが、ユーザーが権限がない場合は、web.configの認証セクションで設定されたloginUrlにリダイレクトされ、?ReturnUrl = querystringパラメータが含まれているため、ユーザーが認証されると

ユーザーがデフォルト以外の言語でページを要求した場合、ここで二つの問題があります。

  1. loginUrlはそれが
  2. 書き換えられていますにreturnurlパラメータはまた、生のパスを無視する前にパスを無視しますが。

これは、Request.RawUrlではなくRequest.Url.PathAndQueryと同じです。

私は、複数の場所のパスを持つ1つのweb.configファイルを使用していますので、私は、すべての可能な文化値から保護する必要があると思いますので、私が代わりにAuthorizeRequestイベントでパイプラインにジャンプすることはできません。これも最初の問題は修正されません。

私は反射鏡でFormsAuthenticationModuleを経てきたと私は#1と#2を解決するために、それを変えることができる場所を私は見たが、それはもちろん、密閉されています。

また、私はたくさんの周りを閲覧しましたが、私は、任意の実行可能な解決策を参照することはできません。

FormsAuthenticationModuleはUrlAuthorizationModuleで生成されます401ヘッダをチェックします。 loginUrlページで参照元(空の場合)を検索すると、それが確認されます。

どのような考えですか?

EDIT#1

私は、IIS 6を使用していて、IIS 7はオプションではありません。

EDIT#2

私はローカルリソース(デザインビュー:[ツール]> [ローカルリソースの生成)を生成したときので、ログインページがデフォルトの文化/ UIカルチャを拾っていなかった、IDEは次を追加しました

文化= "auto" のメタ:pageディレクティブにたResourceKey = "PageResource1" uiculture = "auto" の

vs.net 2008年にはこれに注意してください!少なくともこれは参照されていない既定の文化に関する問題の1つを解決しますが、#1と#2は未だに優れています。私は自分のリダイレクトを行うためにパイプラインのイベントの一つに飛び込むが、System.Web.Securityを反映してできることを期待し

EDIT 3

。UrlAuthorizationModule OnEnterメソッドを使用して、401ヘッダーが設定されると、メソッドがapplication.CompleteRequestを呼び出すことがわかりました。これは、あなたが推測できるように、EndRequestイベントにわかります。これはFAモジュールがリダイレクトにジャンプしたものです。私は自分のリダイレクトを行うために前に飛び越えることはできません!この問題を抱える人が増えていないのは驚いています。


例:私は物理的なフォルダ/メンバーにメンバーのセクションを持って

/それは、フォーム認証で保護されています。 web.configファイルで

、私が持っている:

<authentication mode="Forms"> 
    <forms loginUrl="~/members/login.aspx" timeout="40" /> 
</authentication> 

と...

<location path="members"> 
     <system.web> 
      <authorization> 
       <deny users="?" /> 
       <allow roles="Members" /> 
       <deny users="*" /> 
      </authorization> 
     </system.web> 
    </location> 

認証されていないユーザーは、の/メンバー/インデックスページを要求すると、それらはloginUrlにリダイレクトしますFormsAuthenticationModuleによって上記の認証セクションから取得します。また、要求されたページに?ReturnUrlパラメータを追加します。

ユーザーは既定のカルチャを使用してウェブサイトを閲覧している場合、これはうまく動作しますが、私のHttpModuleを、パスの最初の部分でのカルチャ名の存在に基づいて文化を設定します。

ので、/fr-ca/members/index.aspxは/members/index.aspxに書き直さ取得し、フランス語(カナダ)への文化/ UIカルチャを設定します。不幸にも、FormsAuthenticationModuleは元のURLではなく、書き換えられたURLを使用してloginUrlページにユーザーを送ります。したがって、文化の設定が失われ、リダイレクトURLが正しくありません。

私は手動でのログインフォームにリダイレクトを行っていると考えることができる唯一のことについて@グレッグ

+0

私は問題が何であるかを正確に理解することができないと認めなければなりません。おそらくいくつかのサンプルデータが役立つでしょうか? – Greg

+0

上記の情報を少し追加しました。希望が役立ちます。 – ScottE

+0

それはそれをもっと分かりやすくしました。 – Greg

答えて

3

問題を解決しました。

は鍵が当時の追加、私のカスタムHttpModuleを追加することを、のmachine.configのHttpModulesをクリアして判明デフォルトのHttpModules必要。これにより、私のカスタムhttpModuleは、FormsAuthenticationHttpModuleの前のEndRequestイベントにジャンプすることができました。

<httpModules> 
    <clear/> 
    <!-- custom --> 
    <add name="LocalizationHttpModule" type="LocalizationHttpModule"/> 
    <!-- add back defaults, exlude PassportAuthentication, AnonymousIdentification, Profile --> 
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" /> 
    <add name="Session" type="System.Web.SessionState.SessionStateModule" /> 
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" /> 

</httpModules> 

その後、私のカスタムHttpModuleをして、私はちょうど401のステータスコードを探し、EndRequestのにタップし、私が望むようにリダイレクトします。基本的には、私のニーズに合わせてFormsAuthenticationHttpModule OnLeaveメソッドからコードを書き直しています。

Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init 

    Dim authentication As AuthenticationSection = WebConfigurationManager.GetSection("system.web/authentication") 
    If authentication.Mode = AuthenticationMode.Forms Then 
     Me._LoginUrl = authentication.Forms.LoginUrl 
     AddHandler context.EndRequest, AddressOf Context_EndRequest 
    End If 

End Sub 

Private Sub Context_EndRequest(ByVal sender As Object, ByVal e As EventArgs) 
    Dim application As HttpApplication = DirectCast(sender, HttpApplication) 
    Dim context As HttpContext = application.Context 

    If (context.Response.StatusCode = &H191) Then     
     ' do custom redirect here 
    End If 

End Sub 
1

に役立ちます願っています。

1)メンバーシップディレクトリ
にすべてのアクセスを許可する2)メンバーシップ内のすべてのページは、ページのサブクラスから直接継承されます。
3)PageサブクラスのPreInit(?)で、userがメンバシップロールのメンバーであるかどうかを確認します。
4)ReturnURLパラメータを含むログインページのURLを自分で作成し、ユーザーをログインURLにリダイレクトします。

また、あなたのweb.configファイルに<場所>セクションの束を置くことによって、これをハックすることができるかもしれません。例:<ロケーションパス= "FR-CA /メンバー"> < authenication> <フォームloginUrl = "〜/ FR-CA /メンバー/ login.aspxの"> ...しかし、私は本当に分かりません。

は私が慣れていないだとそれを行うには、おそらく他の方法があります。

+0

+1この特定のアプリケーションで動作するソリューション。実際には、メンバーのセクションの基底クラスから継承しているので、かなり簡単です。私は、複数の保護されたセクションを持つより複雑なシナリオでは困難であるため、これを必要としないソリューションを希望します。フォーム認証モジュールでEndRequestが呼び出される前にパイプラインに飛び込むことができることを期待していましたが、動作させることはできません。 – ScottE

+0

ええ、それは理想的な解決策ではないことに同意します。 – Greg

+0

とにかく複数のセクションを持つことはできません。 – ScottE

関連する問題