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

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

В настоящее время мой веб-сайт 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, но это просто для иллюстрации того, чего я пытаюсь достичь. Может ли кто-нибудь предоставить простое решение или ссылки на решения, которые они, возможно, уже используют?

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


person Dai Bok    schedule 09.07.2010    source источник
comment
Спасибо за ответы, Джим и Гертьян. Думаю, похоже, придется какое-то решение взломать. Отметил вас обоих за ответы.   -  person Dai Bok    schedule 12.07.2010


Ответы (2)


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

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

person Gertjan    schedule 09.07.2010
comment
спасибо, есть пара решений, которые мы придумали, добавить язык в файлы cookie или сеансы, ряд хаков, которые я могу придумать, но есть ли правильный способ сделать это с помощью проверки подлинности с помощью форм? - person Dai Bok; 09.07.2010
comment
Я не думаю, что вы сможете позволить аутентификации справиться с глобализацией. Часть аутентификации отвечает только за то, чтобы посмотреть, аутентифицирован ли кто-то или нет, и обработать эти ситуации. Этот процесс не знает никакой глобализации. Я думаю, вы действительно должны поместить глобализацию на страницу, используемую для входа в систему. - person Gertjan; 09.07.2010
comment
Спасибо, Гертян, я думаю, что мы, вероятно, сделаем что-то подобное. - person Dai Bok; 12.07.2010

Дай,

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

    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 в маршруты по мере необходимости. Я посмотрю, смогу ли я откопать код, который я использую, но, надеюсь, приведенного выше будет достаточно, чтобы вы разобрались с ним.

Джим

person jim tollan    schedule 09.07.2010
comment
Йип, подумал о хитростях вокруг этого, например о сохранении языкового кода в tmpdata или о чем-то подобном. Я надеялся, что будет какое-то свойство объекта, которым вы могли бы манипулировать, например: controller.httpContext.formsAuthenticationObject.loginurl? - person Dai Bok; 09.07.2010