ASPNET MVC当中间方法需要身份验证时,ReturnUrl意外行为

时间:2017-06-14 15:55:30

标签: asp.net-mvc razor

直接调用login方法时,

returnurl正常。当其他需要身份验证的方法调用它时,returnurl路径将被添加到当前URL。

// GET: /Account/Login
    [AllowAnonymous]
    public ActionResult Login(string ReturnUrl)
    {
        ViewBag.ReturnUrl = ReturnUrl;
        return View();
    }

Login.cshtml:

 @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                        {(... omitted for brevity)

登录视图是一种模式。因此它包含以下脚本处理用户关闭模式而不使用loggin:

    $("#modalLoginDiv").on("hidden.bs.modal", function () {
    window.location = '@ViewBag.ReturnUrl';
});

从页面直接调用方法(主页导航栏)

  

http://localhost:51003/Gifts/Details/1589

ReturnUrl值为" / Gifts / Details / 1589" ,关闭登录模式返回页面http://localhost:51003/Gifts/Details/1589,如预期的那样

现在,当从同一页http://localhost:51003/Gifts/Details/1589上的以下链接调用请求身份验证的方法时:

  

http://localhost:51003/messagemanager/ReportThis?productId=1589

[HttpGet]
    [Authorize(Roles = "Admin, Users")]
    public ActionResult ReportThis(int productId)
    {
        ViewBag.productId = productId;
        return View();
    }

作为ReportThis方法需要身份验证,将触发Login方法,同样,Login方法中的ReturnUrl值看起来与预期一样:

  

/给messageManager / ReportThis?的productId = 1589

如果我关闭登录模式而没有登录意外发生的事情:当传递给Login方法参数的ReturnUrl值保持正常时,浏览器URL现在是

  

http://localhost:51003/Account/Login?ReturnUrl=%2Fmessagemanager%2FReportThis%3FproductId%3D1589

即returnUrl已添加到帐户/登录URL。 作为抵押品结果,登录模式显然会无休止地加载。

我无法弄清楚导致这种意外行为的原因以及如何修复它,因为ReturnUrl值总是看起来很好但在第一种情况下它正确地替换了以前的URL,而中间方法调用它时它被添加到帐户/登录URL

1 个答案:

答案 0 :(得分:0)

您可以尝试使用ReturnUrl = Request.QueryString["ReturnUrl"]代替ViewBag.ReturnUrl

吗?
Html.BeginForm("Login", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] })


[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginInputModel model, string ReturnUrl) {
...
}