如何从url中删除returnurl?

Ali*_*söz 35 asp.net asp.net-mvc forms-authentication

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

我怎样才能做到这一点?

RPM*_*984 23

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

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

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

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

我正在尝试在登录后将用户重定向到静态页面以进行一些选择.

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

  • 查询字符串的RedirectUrl部分中的数据可能会在枚举攻击中使用,具体取决于它显示的内容.有合理的理由隐藏用户的数据. (6认同)

Wil*_*eys 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 );

  }
Run Code Online (Sandbox Code Playgroud)


Aiv*_*ler 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器上使用它

[CustomAuthorizeAttribute]
public ActionResult Login()
{


    return View();
}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个解决方案,虽然我认为将句子放在`HandleUnauthorizedRequest`并使用这一行代替`filterContext.Result = new RedirectResult(FormsAuthentication.LoginUrl);更有意义. (2认同)

小智 9

简单...

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

[AllowAnonymous]
public ActionResult LoginRedirect(){ return RedirectToAction("Login"); }
Run Code Online (Sandbox Code Playgroud)

Webconfig

<authentication mode="Forms">
    <forms loginUrl="~/Account/LoginRedirect" timeout="2880" />
</authentication>
Run Code Online (Sandbox Code Playgroud)


Sco*_*ell 8

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

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

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

快乐编程!