【问题标题】:Razor PageModel RedirectToRouteResult does not work when calling OnPost调用 OnPost 时 Razor PageModel RedirectToRouteResult 不起作用
【发布时间】:2020-04-25 19:51:51
【问题描述】:

我正在尝试实现简单的 Asp.net 核心 Web 应用程序登录流程。

登录模型

namespace Trading_System.UI.Pages.Account
{
    public class LoginModel : PageModel
    {

        [BindProperty]
        public string Username { get; set; }

        [BindProperty]
        public string Password { get; set; }

        public string ReturnUrl { get; set; }

        public string ErrorMessage { get; set; }

        private IUserManager m_userManager;

        public LoginModel(IUserManager userManager)
        {
            m_userManager = userManager;
        }

        public void OnGet(string returnUrl)
        {
            ReturnUrl = returnUrl;
        }

        public async Task<IActionResult> OnPost()
        {
            var user = m_userManager.GetUser(Username, Password);
            if (user == null)
            {
                ErrorMessage = "Username or password are invalid.";
                return Page();
            }

            var claims = new List<Claim>()
            {
                new Claim(ClaimTypes.NameIdentifier, user.UserName)
            };

            var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

            var principal = new ClaimsPrincipal(identity);

            await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

            return new RedirectToRouteResult(ReturnUrl);
        }

        public async Task<IActionResult> OnPostLogout(string returnUrl)
        {
            await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            return new RedirectToPageResult("/index");
        }
    }
}

登录的cshtml代码

@page
@model Account.LoginModel
@{
    ViewData["Title"] = "Login";
}

<div class="login-page">
    <div class="page-header">
        <h1>Login</h1>
    </div>

    <div class="row">
        <div class="col-sm-6">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">Please enter your credentials</h3>
                </div>
                <div class="panel-body">
                    <form method="post">
                        <fieldset>
                            <div class="form-group">
                                <label asp-for="Username"></label>
                                <input class="form-control" placeholder="Username" asp-for="Username" autofocus>
                            </div>
                            <div class="form-group">
                                <label asp-for="Password"></label>
                                <input type="password" class="form-control" placeholder="Password" asp-for="Password" autocomplete="off">
                            </div>
                            <div class="form-group">
                                <button class="btn btn-primary">Login</button>
                            </div>
                            @if(!string.IsNullOrEmpty(Model.ErrorMessage))
                            {
                                <div class="alert alert-warning">@Model.ErrorMessage</div>
                            }
                        </fieldset>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

我在调用 OnGet 时设置 ReturnUrl 属性(例如“https://localhost:44389/Account/Login?ReturnUrl=%2FSecretPage”)但我也尝试手动设置它,所以问题不存在。

按下登录后,无论给出的 ReturnUrl 是什么,我都会被重定向到登录页面(我可以在 chrome 中看到 302 响应)。 提交后的url为“https://localhost:44389/Account/Login?Length=14

我做错了什么?我只想重定向回我在重定向到登录页面之前的路线。

【问题讨论】:

    标签: asp.net asp.net-core razor


    【解决方案1】:

    RedirectToRouteResult 重定向到 route,其中路由是通过 MVC 路由器配置的命名路由。

    如您的示例所示,传递给您的登录操作的 ReturnUrl 是一个相对 URL:/Account/Login?ReturnUrl=%2FSecretPage。所以ReturnUrl"/SecretPage"

    相对 URL 通常等于命名路由,因此在此处使用 RedirectToRoute 将不起作用。你可以做的是返回一个LocalRedirectResult

    return LocalRedirect(ReturnUrl);
    

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 2021-10-09
      • 2022-01-12
      • 2020-08-28
      • 2020-07-09
      • 2019-04-27
      • 1970-01-01
      • 2017-09-29
      • 2018-11-07
      相关资源
      最近更新 更多