我在地址栏中提供以下网址:
http://localhost:55875/admin
在按下回车后,它就变成了:
http://localhost:55875/Account/Logon?ReturnUrl=%2fadmin
我已经调试了登录操作方法的逻辑,但没有看到任何将returnurl附加到提供的url的逻辑?这是如何发生的?
http://localhost:55875/admin
http://localhost:55875/Account/Logon?ReturnUrl=%2fadmin
当非认证用户尝试进入需要身份验证的应用程序部分时,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中的原因是,当用户输入用户名和密码后进行提交时,处理回发的控制器操作将可以访问此值。
[AllowAnonymous]
属性即可。 - Sirwan Afifi[AllowAnonymous]
会重定向已登录的用户吗? - ebram khalil您的应用程序必须具有登录验证,由 [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);
}
路由是任何ASP.NET MVC
应用程序的核心概念之一。一个MVC
应用程序的URL
是您的应用程序根URL
与控制器
名称和接收请求的Action
的组合,例如:
http://localhost:55875/{controller}/{action}/{optional parameters}
Account Controller
和Authorization
成员资格提供程序的新项目。正如其他成员所提到的,Authorize
属性可能是您被重定向到logon
页面的主要原因。在浏览器中,每当您在地址栏中按下回车键时,浏览器都会向服务器发出如果未经授权的用户尝试访问标记有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>
loginUrl
的视图。尝试删除[Authorize]
操作过滤器,以便进行更改并查看发生了什么。最终,您的业务逻辑决定需要哪些视图只允许授权或匿名访问。但是,您还可以查看AllowAnonymous属性。它允许您跳过特定contoller
或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]
过滤器。
此文章对MVC中的Action过滤器有良好的概述。<authentication mode="Forms" >
<forms loginUrl="~/Account/Logon"/>
</authentication>
这个部分说每次你尝试访问授权页面时,都会被重定向到这个页面,由于它是表单身份验证,所以你会被重定向到这个页面。
另外,你可以使用 Authorize
和 AuthorizeAttribute
,告诉应用程序以下的 ActionResult
不能被匿名用户访问。你可以在class
级别或ActionResult
级别中使用此属性,如下所示:
[Authorize]
public class HomeController
{
}
或者
public class HomeController
{
[Authorize]
public ActionResult Index()
{
}
}