在ASP.NET Identity中,可以使用ReturnUrl参数来重定向到登录后的完整URL。以下是一个示例解决方法:
在登录控制器的Login动作中,检查ReturnUrl参数是否存在,并将其存储在redirectToUrl变量中:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (!string.IsNullOrEmpty(returnUrl))
{
var redirectToUrl = returnUrl;
// 检查redirectToUrl是否是一个本地URL
if (Url.IsLocalUrl(redirectToUrl))
{
return Redirect(redirectToUrl);
}
}
// 如果redirectToUrl不是本地URL,则重定向到默认URL
return RedirectToAction("Index", "Home");
}
// 验证失败,显示错误消息
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
// 模型验证失败,显示错误消息
return View(model);
}
请注意,redirectToUrl需要进一步检查是否是本地URL。如果不是本地URL,可能会存在重定向攻击的风险。因此,在重定向之前,我们使用Url.IsLocalUrl(redirectToUrl)方法检查URL是否是本地URL。