什么是mvc3中的ReturnURL?

3
在mvc3中,返回URL是什么?当我在浏览器的地址栏中输入我的网址时,自动追加返回URL。这是如何发生的?
我在地址栏中提供以下网址:
http://localhost:55875/admin

在按下回车后,它就变成了:
http://localhost:55875/Account/Logon?ReturnUrl=%2fadmin

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

考虑创建一个“空”的MVC应用程序来学习基础知识。 - Daniel Conde Marin
4个回答

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中的原因是,当用户输入用户名和密码后进行提交时,处理回发的控制器操作将可以访问此值。


如果我想要将一些页面(比如注册页面)仅供未登录的用户访问,应该如何正确实现? - ebram khalil
我们只需要在我们的Action方法上添加[AllowAnonymous]属性即可。 - Sirwan Afifi
[AllowAnonymous]会重定向已登录的用户吗? - ebram khalil
1
你不需要将url存储在aViewBag中,因为框架会在早期自动完成此操作。 - usefulBee

1

您的应用程序必须具有登录验证,由 [Authorize] 特性处理。当用户未经身份验证时,它将返回到登录页面,并带有 returnurl 为管理员。

有关 AuthorizeAttribute 的更多信息,请参见 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);
        }

我该如何默认编码returnUrl,在startup.cs或webconfig中有任何设置吗? - Ganesh Vellanki

1

路由是任何ASP.NET MVC应用程序的核心概念之一。一个MVC应用程序的URL是您的应用程序根URL控制器名称和接收请求的Action的组合,例如:

http://localhost:55875/{controller}/{action}/{optional parameters}

您可能已经选择了使用Account ControllerAuthorization成员资格提供程序的新项目。正如其他成员所提到的,Authorize属性可能是您被重定向到logon页面的主要原因。
Authorize attribute的文档中可以看到:

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

在浏览器中,每当您在地址栏中按下回车键时,浏览器都会向服务器发出GET请求以获取资源。
这可能就是发生的情况。您的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>

MVC利用内置身份验证逻辑的强大功能,并将用户重定向到已设置loginUrl的视图。尝试删除[Authorize]操作过滤器,以便进行更改并查看发生了什么。最终,您的业务逻辑决定需要哪些视图只允许授权或匿名访问。但是,您还可以查看AllowAnonymous属性。它允许您跳过特定contolleraction的授权。
[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();
    }
}

你也可以自定义/覆盖这些操作过滤器的行为。
请注意,如果您选择了具有Internet和Membership提供程序的项目,则[Authorize]已添加到controller本身,这将使此授权内部的所有操作都受到保护,除非存在[AllowAnonymous]过滤器。 此文章对MVC中的Action过滤器有良好的概述

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()
    {
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接