2010-12-17 10 views
0

ログインリダイレクトURLにクエリ文字列パラメータが追加されているプロダクションアプリケーションでこの問題が発生しました。これを再現するには、新しいMVCプロジェクトを作成します(私はMVC2とMVC3 R2の両方でテストしました)。 HomeControllerでは、次のアクションを追加しますASP.NET MVC UnauthorizedResultログインURLに不要なパラメータを追加する

public ActionResult Break() 
{ 
    return new HttpUnauthorizedResult(); 
} 

起動アプリケーションをして/home/break?a=1&b=2を打ちます。だから、これは当然/Account/LogOn?ReturnUrl=/home/break%3fa%3d1%26b%3d2にリダイレクトする必要がありますが、それは実際にもURLの最後に要求されたパラメータ(&a=1&b=2)を追加します。

alt text

ですが、なぜでしょうか? ReturnUrlのエンコードされたURLには必須のパラメータがあるため、これらのパラメータを追加する必要はありません。私はそれが本番アプリケーションでは何かになると思っていましたが、上記の手順に従えば、デフォルトのMVCアプリケーションもこれを再現します。これを解決する方法について考えてみてください。

答えて

1

これは、LogOnアクションが元の(符号化されていない)クエリーストリング値にアクセスできるように行われます。

だから、URI

http://localhost:65183/Account/LogOn?ReturnUrl=/home/break%3fa%3d1%26b%3d2&a=1&b=2

与えにreturnurlキー/値のペアは、ログイン成功後にリダイレクトするURIであり、それは前の要求からのエンコードされたクエリ文字列のペアが含まれています。

この動作を変更するには、リダイレクトの作成方法を上書きする必要があります。

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.RedirectLocation != null && Response.RedirectLocation.Contains("ReturnUrl")) 
    { 
     // change redirect URI 
    } 
} 
+0

ありがとうございました。今私が考えていることは意味があります、それはちょうど私をとても興味深いものにしました。私はそれが設計されているので、これを残しておきます。 – TheCloudlessSky