asp.net-mvc-4 - 我应该如何在 MVC 4 中使用 ReturnUrl = ViewBag.ReturnUrl

标签 asp.net-mvc-4 asp.net-mvc-routing simplemembership

我正在开发“ASP.NET MVC 4”应用程序。我正在使用/学习 SimpleMembershipProvider 并尝试坚持 VS2012 使用 Internet 模板 创建的默认逻辑(如果我没记错的话,是带有“SimpleMembershipProvider”的逻辑)盒子外面)。

我被困在 AccountController 中,我无法弄清楚如何使用此方法:

private ActionResult RedirectToLocal(string returnUrl)
        {
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

据我了解,整个想法是重定向到您决定登录的位置(正是我想要完成的任务)。我看了一下它在 View 中的使用方式:

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

寻找一个实际上ViewBag.ReturnUrl设置了一些值的地方,我只在这里得到了这个方法:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

我对如何准确地获取位置/网址感到非常困惑。我设置了一些断点,但我从未见过 returnUrlnull 不同,在这种情况下,这对我来说似乎很合乎逻辑,因为它在任何地方都没有值(value)(除非我当然会错过一些东西)。

所以我真的不明白这是如何工作的。我发布上述内容只是为了表明我尝试做作业,我尽可能多地进行调查,但没有找到答案,所以我在这里问。您能否提供有关其实际工作原理的解释/示例?

最佳答案

当使用表单例份验证并且用户未经过身份验证或授权时,ASP.NET 安全管道将重定向到登录页面,并在查询字符串中作为参数传递 returnUrl 等于所要访问的页面重定向到登录页面。登录操作获取此参数的值并将其放入 ViewBag 中,以便可以将其传递给 View。

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

然后 View 将这个值存储在 View 中这行代码所示的表单中。

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

它存储在 View 中的原因是,当用户在输入用户名和密码后执行提交时,处理回发的 Controller 操作将有权访问该值。

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }

如果模型状态有效,并且通过调用 WebSecurity.Login 方法对其进行身份验证,则它会使用 returnUrl 值调用方法 RedirectToLocal em> 来自 View ,最初来自创建 View 的登录操作。

如果用户没有像在默认布局中单击页面顶部的登录链接那样被重定向到登录页面,则 returnUrl 值将为 null。在这种情况下,用户登录成功后将被重定向到主页。 returnUrl 的全部目的是自动将用户发送回他们在经过身份验证/授权之前尝试访问的页面。

关于asp.net-mvc-4 - 我应该如何在 MVC 4 中使用 ReturnUrl = ViewBag.ReturnUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20123612/

相关文章:

mysql - asp.net Identity 2.0的Extent用户表

c# - 有没有比在 mvc razor View 中使用 if 语句显示带有角色的 html 代码更好的方法

asp.net - MVC4 中的 SimpleMembershipProvider 在初始化时在方法上抛出 NotSupportedException

c# - 从 Controller 下载Spire.doc文档进行查看

javascript - 如何防止 Bootstrap 模式在浏览器刷新完成后关闭?

asp.net-mvc - 为什么 ASP.NET 路由优先于 web.config Http Handlers 部分?

asp.net-mvc - ViewModel 内的 MVC3 RouteUrl

asp.net-mvc - Asp.Net Mvc 中的路由问题

azure - 命名架构在 Azure SQL 中不起作用

asp.net-mvc - 具有多个数据库或提供程序的 MVC4 简单成员身份验证