如何更改ASP.NET MVC使用的“ReturnUrl”参数的名称?

时间:2011-08-07 01:28:06

标签: c# asp.net-mvc-3

ReturnUrl有点难看。我想改用redirect。如何指定应与表单身份验证重定向URL一起使用的参数名称以及[Authorize]属性?或者我是否必须创建IAuthorizationFilter实现? :(

示例:

[Authorize]
public class Tools : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

如果用户未登录访问http://example.com/tools,我希望将其重定向到http://example.com/account/logon?redirect=%2ftools,而不是默认http://example.com/Account/LogOn?ReturnUrl=%2ftools

对于/ account / logon部分,我可以修改Global.asax中的路由并更改

<authentication mode="Forms">
  <forms loginUrl="~/account/logon" timeout="2880" />
</authentication>
web.config中的

。但我不知道如何更改ReturnUrl参数。

7 个答案:

答案 0 :(得分:12)

将此密钥添加到web.config

的appSettings部分
<add key="aspnet:FormsAuthReturnUrlVar" value="redirect" />

答案 1 :(得分:2)

这里的问题和答案似乎与旧表单身份验证相关。在较新版本的MVC上,例如MVC 5(使用Identity 2.0),您可以在Startup.Auth.cs

中执行类似的操作
app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/account/login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            },
            ReturnUrlParameter = "redirect"
        });

重要的部分当然是ReturnUrlParameter = "redirect"(可以是任何东西)。其余可能与您的项目不同。

答案 2 :(得分:1)

不是最佳解决方案,但它有效......

<rule name="FormsAuthentication" stopProcessing="true">
  <match url="^account/log(i|o)n$" />
  <conditions>
    <add input="{QUERY_STRING}" pattern="^ReturnUrl=([^=&amp;]+)$" />
  </conditions>
  <action type="Redirect" url="account/logon?redirect={C:1}" appendQueryString="false" />
</rule>

答案 3 :(得分:0)

这里的问题是重定向不是帖子。这是一个得到的。在get上传递变量的唯一方法是使用某种类型的查询字符串参数。你可以伪装这个url重写,但它仍然是一个查询参数,并传递给URL。

也许你可以更清楚一下你在寻找什么?

答案 4 :(得分:-1)

无法使用配置更改参数的名称,因为“ReturnUrl”参数名称在System.Web.Security.FormsAuthentication类中进行了硬编码,该类是用于表单身份验证的类,包括重定向。

实现所需结果的一种方法是扩展Authorize属性,使其重定向到具有自定义参数名称的登录页面。然后,根据您使用的FormsAuthentication中的哪些其他方法,您也可以修改它们,特别是FormsAuthentication.RedirectFromLoginPage。

答案 5 :(得分:-1)

参数名称无法更改,这很烦人。我通过编写自己的身份验证模块来解决这个问题 - 您需要知道身份验证的工作原理,但这并不难 - 只要看看它是如何在反射器中完成的(并且可能会简化它,我最终只使用了FormsAuthentication中的cookie加密/解密)。

答案 6 :(得分:-1)

只需在以下键值对的appSettings部分添加web.config:

<add key="aspnet:FormsAuthReturnUrlVar" value="your-custom-parameter-name"/>