mvc3中的返回网址是什么?当我在浏览器的地址栏中记下我的网址时,在追加返回网址会自动附加到它。这怎么开心呢?
我在地址栏中提供以下网址
http://localhost:55875/admin
按下后输入
http://localhost:55875/Account/Logon?ReturnUrl=%2fadmin
我已经调试了Logon操作方法的逻辑,但是没有看到任何将returnurl附加到提供的url的logi?这是怎么发生的?
答案 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
应用程序的核心概念之一。 URL
个MVC
应用的Application root URL
是Controller
后跟Action
名称的组合,然后是http://localhost:55875/{controller}/{action}/{optional parameters}
已向其发出请求的组合,例如
Account Controller
您可能选择了Authorization
和Authorize
会员提供商的新项目。正如其他成员所提到的,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}}过滤器的操作除外(如果存在)。
答案 3 :(得分:0)
首先:您正在尝试访问授权页面,因此每次您尝试访问此页面时,应用程序都会自动将您重定向到登录页面
第二:这是怎么发生的? 在web.config文件中,您可以找到用于身份验证的部分
<authentication mode="Forms" >
<forms loginUrl="~/Account/Logon"/>
</authentication>
此部分说明,每次您尝试访问授权页面时,您都将被重定向到此页面,并且自其表单身份验证后,您将被重定向到此页面
您可以使用Authorize
和AuthorizeAttribute
告诉应用程序匿名用户无法访问以下ActionResult
,您可以在class
中使用此属性级别或ActionResult
级别如下
[Authorize]
public class HomeController
{
}
或者
public class HomeController
{
[Authorize]
public ActionResult Index()
{
}
}