首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何在mvc4中使用ReturnUrl = ViewBag.ReturnUrl

我应该如何在mvc4中使用ReturnUrl = ViewBag.ReturnUrl
EN

Stack Overflow用户
提问于 2013-11-21 22:29:27
回答 3查看 100.2K关注 0票数 41

我正在开发“ASP.NET MVC4”应用程序。我正在使用/学习SimpleMembershipProvider,并尝试在Internet template中使用由VS2012创建的默认逻辑(如果我没有记错的话,就是开箱即用的'SimpleMembershipProvider‘)。

我被困在AccountController中,我不知道如何准确地使用这个方法:

代码语言:javascript
复制
private ActionResult RedirectToLocal(string returnUrl)
        {
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

据我所知,整个想法是重定向到您决定登录的位置(这正是我想要完成的)。我看了一下它在视图中的用法:

代码语言:javascript
复制
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

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

代码语言:javascript
复制
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

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

所以我真的不知道这是怎么回事。我发了上面的帖子,只是为了表明我试着做了我的家庭作业,我尽我所能调查了,但我没有找到答案,所以我在这里问。你能解释/举例说明这是如何实际工作的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-23 00:35:11

当使用窗体身份验证并且用户未经过身份验证或授权时,ASP.NET安全管道将重定向到登录页,并将与重定向到登录页的页相同的returnUrl作为参数传递到查询字符串中。登录操作获取此参数的值并将其放入ViewBag中,以便将其传递给视图。

代码语言:javascript
复制
    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

然后,视图将此值存储在窗体中,如视图中的这行代码所示。

代码语言:javascript
复制
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))

将其存储在视图中的原因是,当用户在输入用户名和密码后执行提交时,处理回发的控制器操作将访问此值。

代码语言:javascript
复制
    [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,该值最初来自创建视图的登录操作。

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

票数 64
EN

Stack Overflow用户

发布于 2013-11-21 23:38:08

这是因为默认的ASP.NET MVC模板使用的是Forms authentication,控制器是用[Authorize]属性修饰的:

代码语言:javascript
复制
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

[Authorize]
public class AccountController : Controller
{
    //...
}

这意味着如果用户未通过身份验证,它将被重定向到forms元素的LoginUrl属性中定义的登录页。

在重定向期间,作为HttpModuleFormsAuthentication将自动附加查询字符串中请求的url。

因此,如果导航到/Account/Login,则不会得到查询字符串中的任何内容,因为它由[AllowAnonymous]属性修饰。但是,如果导航到/Account/Manage,您会注意到查询字符串中的returnUrl变成了/Account/Manage (/Account/Login?ReturnUrl=%2fAccount%2fManage)

因此,您不需要设置returnUrl,框架会为您设置它,您只需在AccountController中使用它,就可以知道在用户通过身份验证后将其重定向到何处。

票数 13
EN

Stack Overflow用户

发布于 2013-11-21 23:25:18

当未经身份验证的用户试图进入应用程序中需要身份验证的部分时,returnUrl就成了问题所在。未经验证的用户所请求的Url基本上存储在returnUrl中。

你可以通过PluralSight tutorial: Building Applications with ASP.NET MVC 4

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20123612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档