現在のURLにreturnURLが含まれている場合、ログインにリダイレクトしない
-
21-12-2019 - |
質問
いくつかの背景:
私たちのクライアントは、完了したときに前のアクションに戻るための多くのアクションを求めました。たとえば、Objectsのリストビューに入っていて、「新しいオブジェクトの作成」ボタンをクリックした場合、彼はフォームを記入して保存した後にリストビューに戻ったかった、またはそのアクションをキャンセルした後にリストビューに戻りたいと思いました。不正なアクセス試行で使用されるReturnUrl
の動作を模倣することによって実装しました(現在のアドレスをURLエンコードされたクエリパラメータとして追加)。
問題:
許可されていない(または他の言葉ではログインしていない)、そしてそれを必要とするアクションにアクセスしようとし、ログインページにリダイレクトされ(私が必要としておくべき)、現在のURLがReturnUrl
Paramに入れることを試みます。ただし、現在のアドレスにReturnUrl
クエリPARAMが含まれている場合は、どこにでもリダイレクトされず、代わりに空白のページが表示されます。これが起こる理由はありますか?
期待された結果は、ReturnUrl
ParamにPURE(現在のURLが独自のReturnUrl
Paramを含むかどうかにかかわらず)現在のURLを使用して、(URLエンコードバージョンの)現在のURLを使用してログイン画面にリダイレクトされます。
予想通りに動作させるための方法はありますか?理論的には、「Returnurl」パラメータ(私自身の行動で)の名前を他のものに変更することができましたが、そのようなパラメータはすでにそれらを名前変更することは簡単なタスクになることはできません。その上、私はこれが最初の場所でうまくいかない理由は本当にわかりません。
p.S。この問題は、Parameter ReturnUrl
に名前を付ける場合にのみ発生します。これは、すべてが必要なのですべてが機能しています。
編集:以前にこの質問が呼び出されました.URLにReturnURLと呼ばれるパラメータが含まれている場合、不正なアクションへのアクセスは何も返しません。私はあなたが理解しやすくするためにタイトルを変えました。
編集:この質問は不正な要求は、ReturnURLクエリ文字列パラメータでログインページにリダイレクトされません。解決策が私の問題を解決した場合は、さらに調査する必要があります。 アップデート:文言は似ていますが、問題は結局のところ異なりますので、重複していません。
解決
これは修正するために大きな痛みを証明しました、しかし私はそれをすることができました。ログインへのリダイレクトが何らかのURLに対して失敗した理由を見つけるためのクエストで、私は自分自身に重要な質問に答えなければなりませんでした。実際にリダイレクトを行う責任があるのは、その方法を上書きできますか?
[Authorize]
フィルタでした)、解決策の検索を開始しました。私が見つけた検索の後、この単純なカスタム認証フィルタ。もちろん、私が箱から出て欲しいものをやりませんでした(そして私が基本的には通常のように機能するのは基本的にはReturnUrl
paramを含むURLで壊すことはできません)、コードを変更してこれを得ました:
public class Authorize2 : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
// 1. Get the default login url that was declared in web.config
string returnUrl = FormsAuthentication.LoginUrl;
// 2. Append current url as a return url to the login url
returnUrl += "?ReturnUrl=" + HttpUtility.UrlEncode(HttpContext.Current.Request.Url.PathAndQuery);
// 3. ...
// 4. Profit
filterContext.Result = new RedirectResult(returnUrl);
}
}
.
このコードを書いた後、私はそれがうまくいかない理由を理解しようとしているもう1時間を過ごしました(HandleUnauthorizedRequest
の内側のブレークポイントは決して打たれませんでした)。それから私はこの< / A>サイトとそれは突然理にかなった。 Mineの同僚は、何らかの理由ですべてのアクションにグローバルAuthorize
フィルタを追加し、自分のカスタムフィルタは何も承認することを求められませんでした( \ app_start \ filterconfig.cs )。その行を取り除いた後(私は最終的に私のカスタムフィルタをその場所に置かなければならないでしょう)、上記のコードは魅力のように機能しました。