[英]Can't redirect to original page after successful login
我更改了web.config文件,添加了以下几行。
<system.web>
<authorization>
<deny users="?"/>
</authorization>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogIn"></forms>
</authentication>
</system.web>
现在,无论访问了什么页面,我都将被重定向到登录页面。 太好了,当我输入凭据时,我希望将用户引导回他们的起点。
public ActionResult LogIn(string token)
{
using (Model model = new Model())
if (model.Users.Any(_ => _.Token == token))
return Redirect(Request.UrlReferrer.ToString());
return View();
}
我发现的问题是UrlReferrer本身就是登录页面,因此我仅重定向到登录页面上已经存在的位置,而不是我最初开始的位置。
我究竟做错了什么?
我究竟做错了什么?
您正在使用旧的ASP.NET安全性(基于物理文件和文件夹)进行MVC(基于控制器和操作)。 确保控制器和动作安全的正确方法是使用AuthorizeAttribute
。 ASP.NET安全性不适用于MVC控制器,因为它们不是基于文件系统的(但请注意,它仍可用于物理文件-您可以阻止对它们的直接访问,然后使用控制器提供条件访问) 。
当您使用AuthorizeAttribute
,将使用ReturnUrl
查询字符串参数自动构建登录URL,该参数用于将用户重定向回其起始位置。
例如,在默认的MVC模板中,这是使用returnUrl
的Login
方法。 它还使用RedirectToLocal
来确保某人不会利用查询字符串参数将用户劫持到另一个网站。
[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);
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
您需要在登录过程中浏览原始页面,假设您想使用URLReferrer,它可能看起来像这样。
[HttpGet]
public ActionResult LogIn()
{
Viewbag.ReturnURL = Request.UrlReferrer.ToString();
return View();
}
[HttpPost]
public ActionResult LogIn(string token, string returnURL)
{
using (Model model = new Model())
if (model.Users.Any(_ => _.Token == token))
return Redirect(returnURL);
return View();
}
警告:使用UrlReferrer属性可能容易出错,因为它依赖于根据请求发生的环境可能无法预测的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.