【问题标题】:What is ReturnURL in mvc3什么是 mvc3 中的 ReturnURL
【发布时间】:2013-12-10 06:07:52
【问题描述】:

什么是 mvc3 中的返回 URL?当我在浏览器的地址栏中写下我的 url 时,附加返回 url 会自动附加到它。这是怎么回事?

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

http://localhost:55875/admin

按回车后就变成了

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

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

【问题讨论】:

  • 考虑启动一个“空的”MVC 应用程序来学习基础知识。

标签: asp.net-mvc-3 returnurl


【解决方案1】:

当未经身份验证的用户试图进入您的应用程序中需要身份验证的部分时,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 }))

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

【讨论】:

  • 如果我想让某些页面(例如注册)仅对 UnLogged 用户可用,这样做的正确方法是什么?
  • 我们只需要用[AllowAnonymous]属性装饰我们的action方法。
  • [AllowAnonymous] 是否在用户登录时重定向用户?
  • 您不需要将 url 存储在 aViewBag 中,因为这是由框架在早期自动完成的。
【解决方案2】:

您的应用程序必须具有由 [Authorize] 属性处理的登录身份验证。由于用户未通过身份验证,它以管理员身份返回登录页面,返回 URL

更多关于 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);
        }

【讨论】:

  • 如何默认对returnUrl进行编码,startup.cs或webconfig中是否有设置...
【解决方案3】:

路由是任何ASP.NET MVC 应用程序的核心概念之一。 MVC 应用程序的 URL 是您的 Application root URL 后跟 Controller 名称和 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 attribute。它允许您跳过特定 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();
    }
}

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

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

This article has good overview of Action filters in MVC.

【讨论】:

    【解决方案4】:

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

    第二:这是怎么发生的? 在 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()
        {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多