繁体   English   中英

成功登录后无法重定向到原始页面

[英]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模板中,这是使用returnUrlLogin方法。 它还使用RedirectToLocal来确保某人不会利用查询字符串参数将用户劫持到另一个网站。

MVC 4(简单成员资格):

    [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);
    }

MVC 5(身份):

    [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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM