Как я могу изменить имя параметра «ReturnUrl», используемого ASP.NET MVC? - PullRequest
8 голосов
/ 07 августа 2011

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 ]

12 голосов
/ 12 июня 2013

Добавьте этот ключ в раздел appSettings вашего web.config

<add key="aspnet:FormsAuthReturnUrlVar" value="redirect" />
3 голосов
/ 11 декабря 2015

Вопрос и ответы здесь, похоже, относятся к старым формам аутентификации.В более новых версиях 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" (может быть чем угодно),Остальное может отличаться для вашего проекта.

1 голос
/ 07 августа 2011

Не лучшее решение, но оно работает ...

<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>
0 голосов
/ 22 сентября 2014

Просто добавьте в ваш web.config в разделе appSettings следующую пару ключ-значение:

<add key="aspnet:FormsAuthReturnUrlVar" value="your-custom-parameter-name"/>
0 голосов
/ 07 августа 2011

Имя параметра нельзя изменить, что раздражает. Я решил это, написав свой собственный модуль аутентификации - вам нужно знать, как работает аутентификация внутри, но это не сложно - просто посмотрите, как это делается в отражателе (и, возможно, упростив его, я использовал только шифрование / дешифрование cookie из FormsAuthentication).

0 голосов
/ 07 августа 2011

Невозможно изменить имя параметра с помощью конфигурации, поскольку имя параметра «ReturnUrl» жестко задано в классе System.Web.Security.FormsAuthentication, который является классом, используемым для проверки подлинности форм, включая перенаправляет.

Одним из способов достижения желаемого результата является расширение атрибута Authorize таким образом, чтобы он перенаправлял на страницу входа с вашим настроенным именем параметра. Затем в зависимости от того, какие дополнительные методы из FormsAuthentication вы используете, вы также можете изменить их, в частности, FormsAuthentication.RedirectFromLoginPage.

0 голосов
/ 07 августа 2011

Проблема здесь в том, что редирект - это не пост. Это получить. Единственный способ передать переменную в get - это использовать параметр строки запроса некоторого типа. Вы можете замаскировать этот URL переписать, но он все еще является параметром запроса и передается по URL.

Может быть, вы могли бы быть немного более ясным о том, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...