web-dev-qa-db-ja.com

URLからreturnurlを削除する方法は?

ユーザーがログインが必要なページにアクセスしたい場合、アドレスバーから「returnurl =/blabla」を削除したい。ログイン後にいくつかの選択を行うためにユーザーを静的ページにリダイレクトしようとしているためです。

どうやってやるの?

35
Ali Ersöz

これがフォーム認証の性質です。 (これはあなたが使用していると推測しています)。

つまり、認証が必要なページにアクセスすると、ASP.NETはログインページにリダイレクトし、ReturnUrlをパラメーターとして渡して、ログイン後のページに戻ることができるようにします。

この機能を削除すると、フォーム認証自体のセマンティクスと設計が破壊されます。 (IMO)

私の提案-あなたがそれを必要としない場合、それを使用しないでください

ログイン後にユーザーを静的ページにリダイレクトして、いくつかの選択をしようとしています。

簡単-ログインを行った後、FormsAuthentication.RedirectFromLoginPage(ReturnUrl QueryStringパラメーターを使用)を行う代わりに、FormsAuthentication.SetAuthCookieを使用してどこにでもリダイレクトするあなたが欲しい。

23
RPM1984

これを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 );

  }
14

カスタム認証属性を作成する

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();
}
11
Aivan Monceller

シンプル...

[AllowAnonymous]
public ActionResult Login() { return View(); }

[AllowAnonymous]
public ActionResult LoginRedirect(){ return RedirectToAction("Login"); }

Webconfig

<authentication mode="Forms">
    <forms loginUrl="~/Account/LoginRedirect" timeout="2880" />
</authentication>
9
Carlos Candeias

RPM1984が指摘したように、サインイン後にユーザーを指定されたURLにリダイレクトする必要はありません。

ReturnUrlクエリ文字列パラメータを削除することが不可欠な場合、いくつかのオプションがあります。おそらく最も簡単なのは、Request.QueryStringsコレクションのReturnUrlパラメーターの存在を確認するログインWebページ/コントローラーです。存在する場合、ReturnUrlなしでログインページにリダイレクトできます。

別のオプションは、FormsAuthenticationModuleのカスタム実装を作成することです。これは、フォーム認証チケットに基づいてユーザーの認証を処理し、許可されていないユーザーをログインページにリダイレクトするクラスです。残念ながら、FormsAuthenticationModuleクラスのメソッドは仮想ではないため、派生クラスを作成して必要なメソッドをオーバーライドすることはできませんが、クラスが非常にシンプルである-おそらく100〜200行のコードである合計で、Reflectorを使用すると、独自のカスタムFormsAuthenticationModuleクラスをすばやく作成できます。このルートに進む場合(お勧めしません)、必要なことは、OnLeaveパラメーターを追加するReturnUrlメソッドのコードを取り出すことだけです。 (このクラスの変更に加えて、アプリケーションが.NET FrameworkのクラスではなくカスタムFormsAuthenticationModuleクラスを使用するようにWeb.configファイルを構成する必要もあります。)

幸せなプログラミング!

8
Scott Mitchell

web.configに場所タグを追加します。ページがサブディレクトリにある場合は、web.configをサブディレクトリに追加します。

<location path="ForgotPassword.aspx">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

ASPは、ReturnUrlクエリ文字列の追加とログインの指示を見落とします。

3
Fio

要求から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メソッドに入れました

2

asp.netコントロールのloginstatusを使用している場合は、ログインステータスコントロールをクリックして、動作セクションの下にあるf4(プロパティ)を押すと、LogOutActionが表示され、[ログインに戻る]ページが選択されます。

注:正常に実装するには、login.aspxという名前のログインページが必要です。

1
Rohith
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");
0
Otto

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」を変更する必要があります。

0
Adam