перенаправить на возврат URL-адреса после входа в систему

У меня есть ссылка в моем представлении бритвы, например:

 <a href="Home/Login?ReturnUrl=Disputes/Index"> disputes</a>

Внутри метода действия моего входа в систему я использую это:

 public ActionResult Login(string returnUrl) {
   if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null)
         returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery);

   if (Url.IsLocalUrl(returnUrl) && !string.IsNullOrEmpty(returnUrl))
   {
      ViewBag.ReturnURL = returnUrl;
   }

   return View();
 }

В представлении I я использую это:

 @Html.Hidden("returnUrl",@Request.QueryString)

Затем в методе действия после публикации:

 public ActionResult LogOn(LogOnModel model, string returnUrl)
 {
   if (ModelState.IsValid)
   {
      if (membershipService.ValidateUser(model.UserName, model.Password, model.Type))
      {
         formsAuthenticationService.SignIn(model.UserName, model.RememberMe);
         SetUserInfo(model.UserName);

         string decodedUrl = "";
         if (!string.IsNullOrEmpty(returnUrl))
            decodedUrl = Server.UrlDecode(returnUrl);

         if (Url.IsLocalUrl(decodedUrl))                    
            return Redirect(decodedUrl);
         else
            return Redirect("Home", Index);

      }
   }
 }

Он перенаправляется на: /Disputes/Index, но он должен перейти на myApp/Disputes/Index, где URL-адрес со строкой запроса выглядит так. /myApp/Home/Login?ReturnUrl=/Disputes/Index

Как решить эту проблему?

28
задан RickL 6 July 2018 в 19:45
поделиться

2 ответа

Я использую комбинацию вышеупомянутого предложения и Request.UrlReferrer, чтобы получить предыдущее местоположение:

    public ActionResult LogOn(string returnUrl)
    {
        //So that the user can be referred back to where they were when they click logon
        if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null)
            returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery);

        if (Url.IsLocalUrl(returnUrl) && !string.IsNullOrEmpty(returnUrl))
        {
            ViewBag.ReturnURL = returnUrl;
        }
        return View();
    }

Таким образом, мне не нужно помещать местоположение в ActionLink.

Я заполняю скрытое поле на странице входа в систему, используя ViewBag.ReturnURL. Затем в HTTPPost для входа в систему ActionResult я перенаправляю пользователя в местоположение в скрытом поле (если оно есть):

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        //returnURL needs to be decoded
        string decodedUrl = "";
        if (!string.IsNullOrEmpty(returnUrl))
            decodedUrl = Server.UrlDecode(returnUrl);

        //Login logic...

        if (Url.IsLocalUrl(decodedUrl))
        {
            return Redirect(decodedUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }
44
ответ дан 28 November 2019 в 03:01
поделиться

Если ReturnURL равно null, убедитесь, что вы вызываете метод действия из представления следующим образом:

// FormMethod.post is optional
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post))
{
    // login view html
}

Контроллер аккаунта:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}
6
ответ дан 28 November 2019 в 03:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: