簡體   English   中英

ASP.NET Core 登錄中的 ReturnUrl 為空

[英]ReturnUrl is null in ASP.NET Core login

我有個人帳戶的 ASP.NET Core 應用程序; 與 VS2017 生成的非常相似。 出於測試目的,我將[Authorize]屬性放在 Home 控制器中的About()操作上。 我按預期重定向到登錄頁面,我看到 URL 是http://localhost:5000/Account/Login?ReturnUrl=%2FHome%2FAbout - 也是預期的。 但是,在 POST Login 方法中 ReturnUrl 為 null。 我在帳戶控制器中有登錄方法:

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

我還明確嘗試了ReturnUrl作為參數,無論是否有[FromQuery] 在所有排列中它都是空的。

這就是我設法讓我的工作

獲取操作

        [HttpGet]
        [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            if (HttpContext.User.Identity.IsAuthenticated)
            {
                if (Url.IsLocalUrl(ViewBag.ReturnUrl))
                    return Redirect(ViewBag.ReturnUrl);

                return RedirectToAction("Index", "Home");
            }

            return View();
        }

我的表格是這樣的:

  <form asp-action="Login" method="post" asp-route-returnurl="@ViewBag.ReturnUrl" >

后行動:

[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> Login(VMLogin model, string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;

    if (!ModelState.IsValid)
    {
        return View(model);
    }

     //Authentication here 
  
    if (Url.IsLocalUrl(ViewBag.ReturnUrl))
        return Redirect(ViewBag.ReturnUrl);

 
    return RedirectToAction("Index", "Home");
}

你應該確定你正在使用

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


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

對於 .net core,這是解決問題的方法。

在你看來,

@using (Html.BeginForm(new { returnUrl = Context.Request.Query["ReturnUrl"] }))

在您的控制器中,

[HttpPost]
public IActionResult Login(YourViewModel m, string returnUrl = null)
{
 if (!string.IsNullOrEmpty(returnUrl))
 {
  return LocalRedirect(returnUrl);
 }
 return RedirectToAction("Index", "Home");
}

首先,您必須像這樣在 get 方法中獲取返回 url:

[HttpGet]
public IActionResult Login(string returnUrl)
{
    TempData["ReturnUrl"] = returnUrl;
    return View();
}

在 get 方法中獲取 returnUrl 作為參數,並通過 tempdata 發送到 post 方法。

post方法也像這樣:

[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model)
{
    //Your Login Code ...

    if (!string.IsNullOrEmpty(TempData["ReturnUrl"] as string) && Url.IsLocalUrl(TempData["ReturnUrl"] as string))
    {
        return Redirect(TempData["ReturnUrl"] as string);
    }

    return RedirectToAction(controllerName:"Home",actionName:"Index");
    }

暫無
暫無

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

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