2012-04-19 3 views
2

FYI - это не MVC.Маршрутизация с помощью веб-форм ASP.NET с аутентификацией форм

Я использую аутентификацию веб-формы и имею следующее в своем web.config.

<authentication mode="Forms"> 
    <forms loginUrl="~/en/Admin/Login" timeout="2880" defaultUrl="/DashBoard" /> 
</authentication> 

Я также использую маршрутизацию для двуязычия/культуры.

Мой маршрут выглядит следующим образом:

RouteTable.Routes.MapPageRoute(
    routeName, "{lang}/Admin/Login", "/Admin/Login.aspx", true, defaults, constraints, dataTokens); 

Если пользователь пытается получить доступ к ограниченной странице они будут перенаправлены/ан/Admin/Логин основе значения в web.config. Моя проблема в том, что если пользователь просматривает сайт на французском языке, страница перенаправляется на страницу регистрации на английском языке, когда ей необходимо перенаправить на/fr/Admin/Login.

Есть ли способ обойти это, поскольку весь сайт должен быть двуязычным?

+0

Я нашел аналогичную проблему с несколькими работами вокруг, но нет истинного решения. http://stackoverflow.com/questions/356982/how-to-redirect-to-a-dynamic-login-url-in-asp-net-mvc – PsychoDUCK

ответ

0

Я нашел подобную проблему с несколькими работами вокруг, но нет истинного решения. How to redirect to a dynamic login URL in ASP.NET MVC

Вот мое решение:

1) Я добавил переменную сеанса, чтобы отслеживать, какой язык выбрал пользователь. (Ex: Session [ "языки"] = "FR")

2) Я сделал свой логин страницу /admin/default.aspx в web.config, как показано ниже:

<authentication mode="Forms"> 
    <forms loginUrl="~/Admin/Default.aspx" timeout="2880" defaultUrl="/en/DashBoard" /> 
</authentication> 

3) В мое событие загрузки страницы для /admin/default.aspx Я определяю, какой язык установлен и перенаправляется на фактическую страницу входа, используя язык сеанса.

if (HttpContext.Current.User.Identity.IsAuthenticated) 
     // Redirect to dashboard 
     ... 
    else 
    { 
     string returnUrl = ""; 
     if (Request.QueryString["ReturnUrl"] != null) 
      returnUrl = "?ReturnUrl=" + Request.QueryString["returnUrl"].ToString(); 

     string selectedLanguage = ""; 
     if (Session["lang"] != null) 
      selectedLanguage = Session["lang"].ToString(); 
     else 
      selectedLanguage = "en"; 

     string loginURL = ConfigurationManager.AppSettings["Auth.LoginUrl"].ToString(); 
     loginURL = loginURL.Replace("{lang}", selectedLanguage); 

     Response.Redirect(loginURL + returnUrl);     
    } 
0

На странице по умолчанию (en // admin/login) проанализируйте ссылочный URL-адрес и перенаправите по мере необходимости. (Предполагается, что локаль определяются на вашем сайте с помощью культуры маркеров в URL пути.) Например,

var referrer = Request.QueryString["ReturnUrl"]; 
if (!string.IsNullOrEmpty(referrer)) 
{ 
    if (!referrer.Contains("/Admin/Login")) 
    { 
     if (referrer.Contains("/fr/")) Response.Redirect("/fr/Admin/Login"); 
     else if (referrer.Contains("/de/")) Response.Redirect("/de/Admin/Login"); 
     // etc. 
    } 
} 

Конечно, что можно улучшить/упростить, используя регулярное выражение для разбора реферер и проверок на действительные места.

+0

Request.UrlReferrer всегда имеет значение null. Я не уверен, что это лучшее решение. Похоже на хак. – PsychoDUCK

+0

@PsychoDUCK хм, интересно. Имеет смысл, хотя, я думаю, поскольку первоначальное перенаправление auth является внутренним для приложения. Я думаю, что вы все равно можете использовать один и тот же подход, используя RedirectUrl в строке запроса вместо URL-адреса. По общему признанию, это взломать, но это похоже на лучшее решение с учетом вашей настройки. – McGarnagle

+0

Я открыт для предложений по лучшему подходу. – PsychoDUCK

Смежные вопросы