2010-07-09 22 views
3

我希望有人能帮助解决这个问题?如何为多种语言全球化ASP.Net表单认证longinUrl?

目前我ASP.Net MVC的网站使用窗体身份验证设置像这样我的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,然后将文化设置为英语。因此,登录后,用户可能需要将语言更改回法文。

不好!

因此,如果网站需要suppurt更多的语言,所以我需要做这样的事情在网络配置:

<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中的代码,但是这是只是为了说明我想实现的目标。任何人都可以提供简单的解决方案,或链接到他们可能已经使用的解决方案?

非常感谢!

+0

感谢您的回答jim和gertjan。我认为看起来我不得不破解某种解决方案。给你两个答案。 – 2010-07-12 13:09:29

回答

1

难道你不能全球化一个登录页面,并根据语言设置显示语言字符串吗?

否则,您应该使用某种重定向,设置一个登录页面并根据该页面内的语言设置重定向到正确的页面。但是,您可能需要向配置添加额外的代码,以告知系统登录的语言版本在身份验证模式下不受保护(您可以在web.config中排除/更改站点某些部分的设置)以防止无尽循环。

+0

谢谢,我们已经想到了一些解决方案,将语言放在cookie或会话中,我可以想到的一些“黑客”,但是有没有一种正确的方式来使用表单身份验证? – 2010-07-09 10:53:57

+0

我认为你不能让身份验证处理全球化。认证部分只负责查看是否有人被认证并处理这些情况。这个过程没有意识到任何全球化。 我认为你真的必须把全球化放到用于登录的页面中。 – Gertjan 2010-07-09 11:43:44

+0

谢谢Gertjan,我想我们可能会这样做。 – 2010-07-12 13:12:53

1

戴,

我做的非常类似的东西,有一个basecontroller它设定了正确的登录语言。我没有代码现在处理,但它是沿线的:

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变量到路由。我会看看我是否可以挖掘出我使用的代码,但希望上面的内容足以让你了解它。

jim

+0

Yip一直在考虑围绕它“黑客”,比如将语言代码保存在tmpdata中,或类似的东西。我希望会有一些对象属性,你可以操作,如: controller.httpContext.formsAuthenticationObject.loginurl? – 2010-07-09 12:24:57