【问题标题】:Rewriting Url in ASP.Net MVC在 ASP.Net MVC 中重写 Url
【发布时间】:2014-10-17 16:13:10
【问题描述】:

从昨天开始,我一直在为这个问题苦苦挣扎。我正在开发一个包含电子邮件服务的网络应用程序。电子邮件包含指向该应用程序特定页面的“链接”。

现在:我有两个场景:

1) 如果用户已经登录(在应用程序中)并且他点击了 他在电子邮件中获得的网址,链接将完美打开。

2) 如果用户没有登录(在应用程序中),那么 url 不会打开,并将自己重定向到登录页面 BaseController 中添加的功能。

*

现在我想要的是当用户在点击 url 后登录时 成功登录用户将重定向到提供的链接 电子邮件。

*

例如:如果用户收到一封电子邮件到员工的详细信息页面,那么在成功登录后,用户将被重定向到员工的详细信息页面。

类似于将 redirecturl 附加到登录页面。

我认为重写url是我应该做的。

但我不知道在这种情况下如何使用它。帮帮我。

【问题讨论】:

  • 您只需要在请求中保留 returnUrl,它应该可以在很小的变化中使用。请参阅下面的答案。

标签: c# asp.net-mvc email url-rewriting


【解决方案1】:

ASP.NET MVC 5 附带的默认项目模板的行为与您描述的完全一样。

如果要重定向到自定义登录 URL,请重新配置 CookieAuthenticationOptions 对象的 LoginPath 属性

LoginPath = new PathString("/Account/Login")

在默认模板中,这是在 Startup.Auth.cs 类中完成的。

注意:如果您使用的是旧版本的 ASP.NET MVC,则默认项目模板的行为方式相同。但以前这是使用表单身份验证实现的,因此为了重定向到自定义登录 URL,您必须在 Web.config 文件中设置 标记的 loginUrl 属性

【讨论】:

  • M 在 asp.net mvc 4.5 应用程序上工作。它不提供任何 startup.auth.cs 类。我现在该怎么办?
  • 查看默认项目模板。您可以通过在 Visual Studio 2013 File -> New Project -> ASP.NET Web Application 中启动一个新项目来查看它然后确保选择“MVC”模板,而不是“Empty”模板
  • 我使用的是 vs2012,它没有像你建议的那样提供任何默认模板
  • VS2012 包含 MVC4,它使用了我描述的旧模型。在 vs2012 中您可以简单地启动一个新的 MVC4 项目(文件 -> 新项目 -> ASP.NET MVC 4 Web 应用程序),然后选择“Internet 应用程序”模板。这将使用 FormsAuthentication,如果您需要重定向到自定义登录 URL,您可以在其中设置 Web.config 文件中 标记的 loginUrl 属性
【解决方案2】:
  1. 默认情况下,如果用户在未经授权的情况下尝试访问授权页面,则会自动重定向到登录页面或在 web.config 文件中为该元素配置的页面。您可以看到查询字符串 returnUrl 具有最初尝试访问的 url 被附加到登录 url。
  2. 要访问返回 url,请包含一个新参数作为 returnUrl,并在模型数据的隐藏字段中维护返回 url,以便在回发时访问以进行重定向。
  3. 如果用户通过身份验证,则在回发时将用户重定向到他打算访问的指定页面。

【讨论】:

  • 实际上链接并没有附加到查询字符串中
  • @Farzi。您是否使用自定义授权属性,否则创建它并在 OnActionExecuting 方法中检查用户是否经过身份验证。如果已通过身份验证,则不执行任何操作,否则获取 url 引荐来源网址并将用户重定向到登录页面,并提供带有引荐来源网址网址的查询字符串 returnUrl。还要验证引荐来源网址是否仅来自同一域。您可以使用全局注册此过滤器。然后您可以按照我在回答中建议的步骤进行操作。
【解决方案3】:

我不记得确切但几个月前我实现了类似的功能,我不得不明确保存 returnUrl(由于 MVC 错误或其他原因) - 请参阅此 link

AccountController.cs - 快照

        [HttpGet]
        [AllowAnonymous]
        public ActionResult Login(string returnUrl, string userName)
        {
            // You login method logic....

            // Add this line to save the returnUrl value
            ViewBag.ReturnUrl = returnUrl;    
        }

Login.cshtml - 快照

@using (Html.BeginForm("Login", "Account", FormMethod.Post ,new {ReturnUrl = ViewBag.ReturnUrl}))
{
  <input type="hidden" name="ReturnUrl" value="@Request.QueryString["ReturnUrl"]" />

 // .....              
}

看看这对你的情况是否有帮助。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2014-09-26
    • 2018-10-11
    • 1970-01-01
    • 2011-08-24
    • 2013-08-28
    • 2015-06-08
    • 2011-02-08
    • 2011-02-16
    相关资源
    最近更新 更多