如何从url中删除returnurl?

时间:2010-09-15 09:03:20

标签: asp.net asp.net-mvc forms-authentication

当用户想要访问登录所需页面时,我想从地址栏中删除“returnurl = / blabla”。因为我在登录后尝试将用户重定向到静态页面以进行一些选择。

我该怎么做?

11 个答案:

答案 0 :(得分:24)

这是表单身份验证的本质。 (我猜你正在使用)。

也就是说,当您访问需要身份验证的页面时,ASP.NET会将您重定向到登录页面,将ReturnUrl作为参数传递,以便您可以返回到登录后的页面。

删除此功能会破坏Forms身份验证本身的语义和设计。 (IMO)

我的建议 - 如果你不需要它,不要使用它

  

我正在尝试将用户重定向到   登录后静态页面做一些   选择。

小蛋糕 - 在您完成登录后,而不是使用 FormsAuthentication.RedirectFromLoginPage (使用那个非常ReturnUrl QueryString参数),只需使用 FormsAuthentication.SetAuthCookie 并在任何地方重定向。

答案 1 :(得分:14)

将此添加到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 );

  }

答案 2 :(得分:11)

创建自定义授权属性

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

答案 3 :(得分:9)

<强>简单...

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

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

<强> Webconfig

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

答案 4 :(得分:8)

正如RPM1984指出的那样,您无需在登录后将用户重定向到指定的URL。

如果必须删除ReturnUrl查询字符串参数,则有几个选项。可能最简单的是在您的登录网页/控制器中,您要检查ReturnUrl集合中是否存在Request.QueryStrings参数。如果存在,您可以重定向回登录页面,但没有ReturnUrl

另一种选择是为FormsAuthenticationModule创建自定义实现,该实现是根据其表单身份验证票据处理用户身份验证的类,并负责将未经授权的用户重定向到登录页面。不幸的是,FormsAuthenticationModule类的方法不是虚拟的,所以你不能创建派生类并覆盖所需的方法,但好消息是类非常简单 - 只需要100-200行代码总计,使用Reflector,您可以快速创建自己的自定义FormsAuthenticationModule类。如果你走这条路线(我不推荐),那么你需要做的就是取出OnLeave方法中的ReturnUrl方法中的代码。 (除了修改此类之外,您还需要配置Web.config文件,以便您的应用程序使用自定义FormsAuthenticationModule类而不是.NET Framework中的类。)

快乐编程!

答案 5 :(得分:3)

web.config添加位置标记。如果您的页面位于子目录中,请将web.config添加到子目录。

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

ASP将忽略添加ReturnUrl查询字符串并指示登录。

答案 6 :(得分:2)

如果要从请求中删除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方法中

答案 7 :(得分:1)

如果您使用的是asp.net控件loginstatus然后点击登录状态控制按f4(对于属性),在行为部分下我们可以看到LogOutAction选择返回登录页面。

注意:为了成功实现它,您必须有一个名为login.aspx

的登录页面

答案 8 :(得分:0)

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");

答案 9 :(得分:0)

您可以使用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事件中 - 显然你需要更改&#34; /default.aspx"匹配登录页面的URL。

答案 10 :(得分:-1)

protected void LoginControl_LoggedIn(object sender, EventArgs e)
{
  Response.Redirect("~/selection.aspx");
}