繁体   English   中英

登录后如何让用户回到原来的页面?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM