什么是mvc3中的ReturnURL

时间:2013-12-10 06:07:53

标签: asp.net-mvc-3 returnurl

mvc3中的返回网址是什么?当我在浏览器的地址栏中记下我的网址时,在追加返回网址会自动附加到它。这怎么开心呢?

我在地址栏中提供以下网址

http://localhost:55875/admin

按下后输入

http://localhost:55875/Account/Logon?ReturnUrl=%2fadmin

我已经调试了Logon操作方法的逻辑,但是没有看到任何将returnurl附加到提供的url的logi?这是怎么发生的?

4 个答案:

答案 0 :(得分:3)

当未经身份验证的用户尝试进入需要身份验证的应用程序部分时,returnUrl会进入图片。未经身份验证的用户请求的Url基本上存储在returnurl中。

例如在装饰有Authorize属性的控制器下面:

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

登录操作会获取此参数的值并将其放入ViewBag中,以便将其传递给View。 然后,View将此值存储在表单中,如View中的此行代码所示。

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

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

答案 1 :(得分:1)

您的申请必须具有登录身份验证,由[授权] attribue处理。如果用户未经过身份验证,则返回登录页面,其中returnurl为admin

有关AuthorizeAttribute How to use authorize attribute on MVC3

的更多信息

以下是您在returnurl上方登录时的标准登录操作,即admin作为第二个参数传递,具体取决于使用return Redirect(returnUrl);将哪个用户重定向到页面

 [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

答案 2 :(得分:1)

路由是任何ASP.NET MVC应用程序的核心概念之一。 URLMVC应用的Application root URLController后跟Action名称的组合,然后是http://localhost:55875/{controller}/{action}/{optional parameters} 已向其发出请求的组合,例如

Account Controller

您可能选择了AuthorizationAuthorize会员提供商的新项目。正如其他成员所提到的,logon属性可能是您被重定向到GET页面的主要原因。

来自Authorize attribute的文档:

  

如果未经授权的用户尝试访问标记为的方法   在Authorize属性中,MVC框架返回401 HTTP状态   码。如果站点配置为使用ASP.NET窗体身份验证,   401状态代码导致浏览器将用户重定向到   登录页面。

在浏览器中,只要您在地址栏中按Enter键,浏览器就会向服务器发出Admin Controller请求以获取资源。

这就是可能发生的事情。您的Index()或其[Authorize]方法使用public class AdminController : Controller { ///<summary> /// This view will open whenever you make a HTTP GET request to your Admin /// controller without providing any action method name in request explicitly. /// Because it is decorated with Authorize attribute, any user who has not logged in /// will be redirected to the login page... ///</summary> [Authorize] public ActionResult Index() { return View(); } } 操作过滤器属性进行修饰,例如

web.config

您可能想知道为什么应用程序重定向到登录视图?

这是因为默认情况下,您的应用程序已在<authentication mode="Forms"> <forms loginUrl="~/Account/Logon"/> </authentication> 文件中设置了此操作。

loginUrl

MVC利用内置身份验证逻辑的强大功能,并将用户重定向到[Authorize]下已设置的视图。

尝试删除contoller操作过滤器进行更改,看看会发生什么。最后,您需要确定哪些视图只需要授权或匿名访问,这是您的业务逻辑。

但是,您也可以查看AllowAnonymous attribute。它允许您跳过特定action[Authorize] public class AdminController : Controller { ///<summary> /// Skips Authorization.. ///</summary> [AllowAnonymous] public ActionResult Index() { return View(); } ///<summary> /// Only allows authorize access... ///</summary> public ActionResult Secure() { return View(); } }

的授权
[Authorize]

您也可以自定义/覆盖这些操作过滤器的行为。

请注意,controller已添加到[AllowAnonymous]本身,如果您选择了具有互联网和会员提供商的项目,该项目将在此授权范围内执行所有操作,但具有{{1}}过滤器的操作除外(如果存在)。

This article has good overview of Action filters in MVC

答案 3 :(得分:0)

首先:您正在尝试访问授权页面,因此每次您尝试访问此页面时,应用程序都会自动将您重定向到登录页面

第二:这是怎么发生的? 在web.config文件中,您可以找到用于身份验证的部分

<authentication mode="Forms"  >
  <forms loginUrl="~/Account/Logon"/>
</authentication>

此部分说明,每次您尝试访问授权页面时,您都将被重定向到此页面,并且自其表单身份验证后,您将被重定向到此页面

您可以使用AuthorizeAuthorizeAttribute告诉应用程序匿名用户无法访问以下ActionResult,您可以在class中使用此属性级别或ActionResult级别如下

[Authorize]
public class HomeController 
{
}

或者

public class HomeController 
{
    [Authorize]
    public ActionResult Index()
    {
    }
}