簡體   English   中英

ReturnUrl指向ActionResult

[英]ReturnUrl Points to an ActionResult

這是場景的方式:

  • 從頭開始創建MVC項目
  • 使用[Authorize]屬性修飾的測試控制器
  • 用戶登錄並定向到主頁
  • 用戶單擊重定向到TestControllerIndex方法的鏈接
  • 用戶等待60秒以使表單身份驗證超時
  • 用戶單擊調用駐留在TestController上的ActionMethod的鏈接
  • MVC框架將用戶重定向到Login頁面,並將ActionMethod名稱附加到URL,而不是附加Index操作方法

TestController

[Authorize]
public class TestController : Controller
{
    // GET: Test
    public ViewResult Index()
    {
        return View();
    }

    [ValidateInput(false)]
    public ActionResult ActionTest()
    {
        return new EmptyResult();
    }
}

HomeController

[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

AccountController

public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult Login()
    {
        return View();
    }

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            try
            {
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                if (Url.IsLocalUrl(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                    return RedirectToAction(controllerName: "Home", actionName: "Index");
            }
            catch
            {
                return View(model);
            }
        }
        return View(model);
    }
}

Login.chtml

@model TestLoginProject.Models.LoginViewModel

@{
    Layout = null;
}

<!DOCTYPE html>
<html lang="en">
<head>
  .....................
</head>

<body>
    <div class="container">
        @using (@Html.BeginForm("Login", "Account", new { returnUrl = Request.QueryString["ReturnUrl"] }, FormMethod.Post, new { @class = "form-signin" }))
        {
            @Html.AntiForgeryToken()
            ....................
            ....................
        }
    </div>
</body>
</html>

Web配置

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="1" />
</authentication>

返回網址的期望是

HTTP://本地主機:2441 /帳號/登錄RETURNURL =%2fTest%2fIndex

相反,當前值是

HTTP://本地主機:2441 /帳號/登錄RETURNURL =%2fTest%2fActionTest

備注

  • 當用戶在超時后單擊鏈接時,在重定向到“登錄”頁面之前,不會執行任何“測試操作”
  • 在VS2017中從頭開始執行Empty MVC項目時提供的所有路由都是默認路由

這是你提到的正常行為!

MVC框架將用戶重定向到Login頁面,並將ActionMethod名稱附加到URL,而不是附加Index操作方法

非常感謝MVC Security管道。 當您使用表單身份驗證並且用戶未經過身份驗證或授權時,ASP.NET安全管道會重定向到登錄頁面並將returnUrl作為參數傳遞給等於重定向到登錄頁面的頁面 (這是需要授權的控制器操作)您通過單擊鏈接調用的)。

所以在這里你不能指望索引 (當前加載的頁面沒有有效和持久的身份驗證),隨后ActionMethod調用安全管道,並且會returnurl枚舉returnurl

請注意,這是因為Controller和View之間的同步通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM