[英]How to return user back to the original page after login?
我如何才能将用户返回到他们登录时所在的原始页面?
显然,我想利用 Identity 的ReturnUrl
属性,但我不知道该怎么做。
视图- <a>
标签将用户重定向到登录页面。
<div class="form-group col-6">
<a class="login-binder" asp-area="Identity" asp-page="/Account/Login" >Please log in to add this recipe</a>
</div>
登录 Model / 构造函数
public class LoginModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LoginModel> _logger;
public LoginModel(SignInManager<IdentityUser> signInManager,
ILogger<LoginModel> logger,
UserManager<IdentityUser> userManager)
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
}
[BindProperty]
public InputModel Input { get; set; }
public IList<AuthenticationScheme> ExternalLogins { get; set; }
public string ReturnUrl { get; set; }
[TempData]
public string ErrorMessage { get; set; }
public class InputModel
{
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
public async Task OnGetAsync(string returnUrl = null)
{
if (!string.IsNullOrEmpty(ErrorMessage))
{
ModelState.AddModelError(string.Empty, ErrorMessage);
}
returnUrl ??= Url.Content("~/");
// Clear the existing external cookie to ensure a clean login process
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
ReturnUrl = returnUrl;
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl ??= Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
}
登录表单
<div class="register-width register-form m-auto py-3 py-sm-4 ">
<form asp-route-returnUrl="@Model.ReturnUrl" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="row">
<div class="form-group offset-sm-2 col-sm-8">
<label asp-for="Input.Email" class="control-label font-weight-bold">Email address</label>
<input asp-for="Input.Email" class="form-control" placeholder="e.g name@example.com" />
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
</div>
<div class="row">
<div class="form-group offset-sm-2 col-sm-6">
<label asp-for="Input.Password" class="control-label font-weight-bold"></label>
<input asp-for="Input.Password" type="password" class="form-control" />
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
</div>
<div class="form-group offset-sm-2 col-sm-6">
<label asp-for="Input.ConfirmPassword" class="control-label"></label>
<input asp-for="Input.ConfirmPassword" type="password" class="form-control" />
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
</div>
<div class="row">
<div class="form-group offset-sm-2 col-sm-auto" style="border:solid 1px black">
<input type="submit" value="Sign in" class="btn btn-primary register-submit bold-text-500" />
</div>
</div>
</form>
</div>
谢谢
令人惊讶的是,我所要做的就是更改a
标签
由此
<a class="login-binder" asp-area="Identity" asp-page="/Account/Login" >Please log in to add this recipe</a>
对此
<a class="login-binder" asp-area="Identity" asp-page="/Account/Login" asp-route-returnUrl="@Context.Request.Path@Context.Request.QueryString">Please log in to add this recipe</a>
当returnUrl
设置为null
时,我对如何将 returnUrl 传递给 Login Get 方法感到困惑,同样使用 Post 方法。
public async Task OnGetAsync(string returnUrl = null)
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.