![](/img/trans.png)
[英]How to force absolute uri kind for returnUrl in ASP.NET Core login redirects?
[英]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.