Как вы глобализируете аутентификацию форм ASP.Net longinUrl для нескольких языков? - PullRequest
3 голосов
/ 09 июля 2010

Надеюсь, кто-нибудь может помочь с решением этой проблемы?

В настоящее время мой веб-сайт ASP.Net MVC использует аутентификацию форм, настроенную так: my web.config:

<authentication mode="Forms">
  <forms loginUrl="en/User/Signin" timeout="2880" />
</authentication>

У нас есть некоторые правила маршрутизации, которые используют префикс / en / в URL в качестве идентификатора языка, но проблема в том, что если кто-то посещает наш французский сайт www.web.com/fr/Secure/privateData, они перенаправлены на www.web.com/en/User/Signin, который, в свою очередь, устанавливает культуру на английский. Поэтому после входа в систему пользователям может потребоваться изменить язык на французский.

Не хорошо!

Так что, если веб-сайт должен поддерживать больше языков, мне нужно сделать что-то подобное в веб-конфигурации:

<authentication mode="Forms">
    <%if (isGerman()) { %>
        <forms loginUrl="de/User/Signin" timeout="2880" />
    <%} else if (isFrench()) {%>
        <forms loginUrl="fr/User/Signin" timeout="2880" />
    <%} else { %>
        <forms loginUrl="en/User/Signin" timeout="2880" />
    <% } %>
</authentication>

Я знаю, что вы не можете иметь код в web.config, но это просто для иллюстрации того, чего я пытаюсь достичь. Может ли кто-нибудь предоставить простое решение или ссылки на решения, которые они уже могут использовать?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Dai,

Я делаю что-то очень похожее, и у меня есть базовый контроллер, который устанавливает язык для правильного входа в систему. У меня нет кода для передачи прямо сейчас, но это что-то вроде:

    public string Lang { get; private set; } // at the top of the abstact basecontroller

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        Lang = requestContext.RouteData.Values["lang"].ToString() ?? System.Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
        ViewData["Lang"] = Lang;

        base.Initialize(requestContext);
    }

Затем я подключаю переменную Lang к маршрутам, как требуется. Я посмотрю, смогу ли я выкопать код, который я использую, но, надеюсь, вышеупомянутого будет достаточно, чтобы разобраться с этим.

джим

1 голос
/ 09 июля 2010

Разве вы не можете просто глобализировать одну страницу входа и отображать языковые строки в зависимости от языковой настройки?

В противном случае вам следует использовать какое-либо перенаправление, установить одну страницу входа и перенаправить на правильную страницу в зависимости от языковых настроек на этой странице. Однако вам может понадобиться добавить дополнительный код в вашу конфигурацию, сообщающий системе, что языковые версии входа в систему не защищены в режиме аутентификации (вы можете исключить / изменить настройки для определенных частей сайта в web.config), чтобы предотвратить бесконечные зацикливание.

...