ASP.Net MVC - перенаправление на маршрут дает цикл перенаправления

Вероятно, это один из тех простых вопросов. Я пытаюсь перенаправить пользователя после того, как он успешно прошел аутентификацию, или вернуть его обратно на страницу входа. Но страница «Успех» находится на другом маршруте, и я не могу заставить работать перенаправление.

Вот мои маршруты в Globals.asax:

routes.MapRoute( _
    "Default", _
    "{controller}/{action}/{id}", _
    New With {.controller = "Login", .action = "Index", .id = ""} _
    )
routes.MapRoute( _
    "Stuff", _
    "{controller}/{action}/{id}", _
    New With {.controller = "Stuff", .action = "Index", .id = ""} _
    )

У меня есть 2 контроллера: LoginController.vb и StuffController.vb. Файл Views/Login/Index.aspx содержит простую форму с кодом:

<form method="post" action="/Login/Authenticate">

LoginController содержит следующий код:

Function Authenticate() As RedirectToRouteResult
    ' authentication code commented out  ;o)

    Return RedirectToRoute("Stuff")
End Function

И StuffController содержит следующее:

Function Index()
    ' show stuff..

    Return View()    ' return /Views/Stuff/Index.aspx
End Function

Вот что я пробовал до сих пор:

  • Функция аутентификации()
  • Функция Authenticate() As ActionResult()
  • Функция Authenticate() как RedirectToRouteResult()

все это вызывает тайм-аут цикла перенаправления в браузере. Что мне не хватает?!


person Andrew    schedule 26.10.2008    source источник
comment
Отличный вопрос, у меня была такая же проблема!   -  person MrBoJangles    schedule 19.12.2011


Ответы (4)


Может ли быть так, что ваш маршрут Stuff имеет точно такую ​​​​же форму, что и маршрут по умолчанию, поэтому, когда вы вызываете

Return RedirectToRoute("Stuff");

результирующий URL-адрес имеет вид: {controller}/{action}/{id}, например. Вход/аутентификация снова, так как вы находитесь внутри действия аутентификации контроллера входа.

Пытаться

RedirectToAction("Index", "Stuff");

Надеюсь, это поможет.

person liggett78    schedule 26.10.2008
comment
Вы правы. Я удалил маршрут «Материалы» и использовал RedirectToAction([View], [Controller]), и это работает — спасибо за вашу помощь: o) - person Andrew; 26.10.2008
comment
О, и мне также нужно было изменить тип возвращаемого значения функции аутентификации на ActionResult :o) - person Andrew; 26.10.2008

Правильный ответ хорош, но:

  • что, если вы когда-нибудь захотите изменить имя контроллера/действия с Staff/Index на что-то другое?

-тогда вам нужно будет изменить значения не только в global.asax, но и во всех местах, где вы использовали технику.

Мое предложение:

return RedirectToRoute("Stuff", (RouteTable.Routes["Stuff"] as Route).Defaults);

Теперь, в этом случае, вы не передаете имена контроллера/действия, которые соответственно являются Stuff/Index. Это позволит вам легко управлять изменениями.

person Tengiz    schedule 29.11.2010

Я не вижу, где вы устанавливаете файл cookie аутентификации или помечаете пользователя как прошедшего аутентификацию каким-либо образом. Это в коде, который вы пропустили?

person tvanfosson    schedule 26.10.2008
comment
Да, я могу ошибаться, но я не думал, что мне понадобится какой-либо код аутентификации, поскольку все, что я действительно пытаюсь здесь сделать, это «перепрыгнуть» контроллеры - от LoginController к StuffController. - person Andrew; 26.10.2008
comment
Если не установить авторизацию. cookie, при условии, что ваши методы действий украшены атрибутом [Authorize], вы будете снова перенаправлены обратно на ваш URL-адрес для входа. - person liggett78; 26.10.2008
comment
Спасибо за примечание об атрибуте [Авторизовать]. Правда в том, что когда я пытался заставить это работать, я не написал код авторизации, поэтому я не украсил какие-либо методы действий с помощью [Authorize] - я просто правильно начал «поток»: o) - person Andrew; 17.12.2008

пытаться

routes.MapRoute( _    
"Stuff", _
"",_  
New With {.controller = "Stuff", .action = "Index", .id = ""} _    
)
person Community    schedule 26.12.2008