ユーザーがログインが必要なページにアクセスしたい場合、アドレスバーから「returnurl =/blabla」を削除したい。ログイン後にいくつかの選択を行うためにユーザーを静的ページにリダイレクトしようとしているためです。
どうやってやるの?
これがフォーム認証の性質です。 (これはあなたが使用していると推測しています)。
つまり、認証が必要なページにアクセスすると、ASP.NETはログインページにリダイレクトし、ReturnUrlをパラメーターとして渡して、ログイン後のページに戻ることができるようにします。
この機能を削除すると、フォーム認証自体のセマンティクスと設計が破壊されます。 (IMO)
私の提案-あなたがそれを必要としない場合、それを使用しないでください。
ログイン後にユーザーを静的ページにリダイレクトして、いくつかの選択をしようとしています。
簡単-ログインを行った後、FormsAuthentication.RedirectFromLoginPage(ReturnUrl QueryStringパラメーターを使用)を行う代わりに、FormsAuthentication.SetAuthCookieを使用してどこにでもリダイレクトするあなたが欲しい。
これをGlobal.asaxファイルに追加します。
public class MvcApplication : HttpApplication {
private const String ReturnUrlRegexPattern = @"\?ReturnUrl=.*$";
public MvcApplication() {
PreSendRequestHeaders += MvcApplicationOnPreSendRequestHeaders;
}
private void MvcApplicationOnPreSendRequestHeaders( object sender, EventArgs e ) {
String redirectUrl = Response.RedirectLocation;
if ( String.IsNullOrEmpty(redirectUrl)
|| !Regex.IsMatch( redirectUrl, ReturnUrlRegexPattern ) ) {
return;
}
Response.RedirectLocation = Regex.Replace( redirectUrl,
ReturnUrlRegexPattern,
String.Empty );
}
カスタム認証属性を作成する
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(
AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string loginUrl = "/"; // Default Login Url
filterContext.Result = new RedirectResult(loginUrl);
}
}
}
それをコントローラーで使用します
[CustomAuthorizeAttribute]
public ActionResult Login()
{
return View();
}
シンプル...
[AllowAnonymous]
public ActionResult Login() { return View(); }
[AllowAnonymous]
public ActionResult LoginRedirect(){ return RedirectToAction("Login"); }
Webconfig
<authentication mode="Forms">
<forms loginUrl="~/Account/LoginRedirect" timeout="2880" />
</authentication>
RPM1984が指摘したように、サインイン後にユーザーを指定されたURLにリダイレクトする必要はありません。
ReturnUrl
クエリ文字列パラメータを削除することが不可欠な場合、いくつかのオプションがあります。おそらく最も簡単なのは、Request.QueryStrings
コレクションのReturnUrl
パラメーターの存在を確認するログインWebページ/コントローラーです。存在する場合、ReturnUrl
なしでログインページにリダイレクトできます。
別のオプションは、FormsAuthenticationModule
のカスタム実装を作成することです。これは、フォーム認証チケットに基づいてユーザーの認証を処理し、許可されていないユーザーをログインページにリダイレクトするクラスです。残念ながら、FormsAuthenticationModule
クラスのメソッドは仮想ではないため、派生クラスを作成して必要なメソッドをオーバーライドすることはできませんが、クラスが非常にシンプルである-おそらく100〜200行のコードである合計で、Reflectorを使用すると、独自のカスタムFormsAuthenticationModule
クラスをすばやく作成できます。このルートに進む場合(お勧めしません)、必要なことは、OnLeave
パラメーターを追加するReturnUrl
メソッドのコードを取り出すことだけです。 (このクラスの変更に加えて、アプリケーションが.NET FrameworkのクラスではなくカスタムFormsAuthenticationModule
クラスを使用するようにWeb.configファイルを構成する必要もあります。)
幸せなプログラミング!
web.config
に場所タグを追加します。ページがサブディレクトリにある場合は、web.config
をサブディレクトリに追加します。
<location path="ForgotPassword.aspx">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
ASPは、ReturnUrl
クエリ文字列の追加とログインの指示を見落とします。
要求からreturnURLを削除して特定のパスにリダイレクトする場合は、次の手順を実行できます。
まず現在のコンテキストを取得し、ユーザーが認証されているかどうかを確認して、最後に現在のパスをリダイレクトします。
HttpContext context = HttpContext.Current;
//verify if the user is not authenticated
if (!context.User.Identity.IsAuthenticated)
{
//verify if the URL contains ReturnUrl
if (context.Request.Url.ToString().Contains("ReturnUrl"))
{
//redirect the current path
HttpContext.Current.Response.Redirect("~/login.aspx");
}
}
クラスLogin.aspx.csからこのコードをPage_Loadメソッドに入れました
asp.netコントロールのloginstatusを使用している場合は、ログインステータスコントロールをクリックして、動作セクションの下にあるf4(プロパティ)を押すと、LogOutActionが表示され、[ログインに戻る]ページが選択されます。
注:正常に実装するには、login.aspxという名前のログインページが必要です。
void Application_BeginRequest(object s, EventArgs e)
{
// ................
// strip return Return Url
if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) && Request.Path.IndexOf("login.aspx")!=-1)
System.Web.HttpContext.Current.Response.Redirect("~/login.aspx");
HttpUtility.ParseQueryStringを使用して、その要素を削除できます。 VB.NETを使用する場合、このコードはこれを行います
Dim nvcQuery As NameValueCollection
Dim strQuery As String = ""
If Not IsNothing(Request.QueryString("ReturnUrl")) Then
If Request.QueryString("ReturnUrl").Length Then
nvcQuery = HttpUtility.ParseQueryString(Request.QueryString.ToString)
For Each strKey As String In nvcQuery.AllKeys
If strKey <> "ReturnUrl" Then
If strQuery.Length Then strQuery += "&"
strQuery += strKey + "=" + nvcQuery(strKey)
End If
Next
If strQuery.Length Then strQuery = "?" + strQuery
If Request.CurrentExecutionFilePath <> "/default.aspx" Then
Response.Redirect(Request.CurrentExecutionFilePath + strQuery)
Else
Response.Redirect("/" + strQuery)
End If
Response.Write(Server.HtmlEncode(strQuery))
End If
End If
これをPage.Initイベントに追加します。明らかに、ログインページのURLと一致するように「/default.aspx」を変更する必要があります。