我正在开发“ASP.NET MVC4”应用程序。我正在使用/学习SimpleMembershipProvider,并尝试在Internet template中使用由VS2012创建的默认逻辑(如果我没有记错的话,就是开箱即用的'SimpleMembershipProvider‘)。
我被困在AccountController中,我不知道如何准确地使用这个方法:
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}据我所知,整个想法是重定向到您决定登录的位置(这正是我想要完成的)。我看了一下它在视图中的用法:
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))寻找一个实际ViewBag.ReturnUrl被设置了一些值的地方,我在这里只得到了这个方法:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}我对如何准确地获取位置/url感到非常困惑。我设置了一些断点,我从未见过returnUrl与null有什么不同,在这种情况下,这对我来说似乎很合乎逻辑,因为它在任何地方都不会获得价值(当然,除非我错过了一些东西)。
所以我真的不知道这是怎么回事。我发了上面的帖子,只是为了表明我试着做了我的家庭作业,我尽我所能调查了,但我没有找到答案,所以我在这里问。你能解释/举例说明这是如何实际工作的吗?
发布于 2013-11-23 00:35:11
当使用窗体身份验证并且用户未经过身份验证或授权时,ASP.NET安全管道将重定向到登录页,并将与重定向到登录页的页相同的returnUrl作为参数传递到查询字符串中。登录操作获取此参数的值并将其放入ViewBag中,以便将其传递给视图。
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}然后,视图将此值存储在窗体中,如视图中的这行代码所示。
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))将其存储在视图中的原因是,当用户在输入用户名和密码后执行提交时,处理回发的控制器操作将访问此值。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}如果模型状态是有效的,并且它们通过调用WebSecurity.Login方法进行身份验证,那么它将使用来自视图的returnUrl值调用方法RedirectToLocal,该值最初来自创建视图的登录操作。
如果用户没有被重定向到登录页面,则returnUrl值将为空,就像用户在默认布局中单击页面顶部的登录链接时一样。在这种情况下,用户将在成功登录后被重定向至主页。returnUrl的整个目的是自动将用户发送回他们在通过身份验证/授权之前试图访问的页面。
发布于 2013-11-21 23:38:08
这是因为默认的ASP.NET MVC模板使用的是Forms authentication,控制器是用[Authorize]属性修饰的:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
[Authorize]
public class AccountController : Controller
{
//...
}这意味着如果用户未通过身份验证,它将被重定向到forms元素的LoginUrl属性中定义的登录页。
在重定向期间,作为HttpModule的FormsAuthentication将自动附加查询字符串中请求的url。
因此,如果导航到/Account/Login,则不会得到查询字符串中的任何内容,因为它由[AllowAnonymous]属性修饰。但是,如果导航到/Account/Manage,您会注意到查询字符串中的returnUrl变成了/Account/Manage (/Account/Login?ReturnUrl=%2fAccount%2fManage)
因此,您不需要设置returnUrl,框架会为您设置它,您只需在AccountController中使用它,就可以知道在用户通过身份验证后将其重定向到何处。
发布于 2013-11-21 23:25:18
当未经身份验证的用户试图进入应用程序中需要身份验证的部分时,returnUrl就成了问题所在。未经验证的用户所请求的Url基本上存储在returnUrl中。
你可以通过PluralSight tutorial: Building Applications with ASP.NET MVC 4
https://stackoverflow.com/questions/20123612
复制相似问题