【问题标题】:Routing with ASP.NET Web Forms with Forms Authentication使用带有表单身份验证的 ASP.NET Web 表单进行路由
【发布时间】:2012-04-19 19:22:29
【问题描述】:

仅供参考 - 这不是 MVC。

我正在使用 Web 表单身份验证,并且在我的 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);

如果用户尝试访问受限页面,他们将根据 web.config 中的值重定向到 /en/Admin/Login。我的问题是,如果用户正在查看法语网站,当需要重定向到 /fr/Admin/Login 时,页面会重定向到英文登录页面。

由于整个网站都需要双语,有什么办法可以解决这个问题吗?

【问题讨论】:

标签: asp.net url-routing form-authentication


【解决方案1】:

在默认 (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.
    }
}

当然,这可以通过使用正则表达式来解析引荐来源并检查有效的语言环境来改进/简化。

【讨论】:

  • Request.UrlReferrer 始终为空。我不确定这是最好的解决方案。看起来像一个黑客。
  • @PsychoDUCK 嗯,很有趣。虽然我猜是有道理的,因为原始的身份验证重定向是应用程序内部的。我认为您仍然可以通过在查询字符串中使用 RedirectUrl 而不是 URL 引用来使用相同的方法。诚然,这是一种 hack,但考虑到您的设置,这似乎是最好的解决方案。
  • 我愿意接受关于更好方法的建议。
【解决方案2】:

我通过一些变通方法发现了一个类似的问题,但没有真正的解决方案。 How to redirect to a dynamic login URL in ASP.NET MVC

这是我的解决方案:

1) 我添加了一个会话变量来跟踪用户选择的语言。 (例如:Session["lang"] = "fr")

2) 我在 web.config 中创建了我的登录页面 /admin/default.aspx,如下所示:

<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);                
    }

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多