【问题标题】:How to preserve ReturnUrl query parameter when submiting form提交表单时如何保留 ReturnUrl 查询参数
【发布时间】:2020-06-17 22:44:12
【问题描述】:

我在 Razor Pages 中使用基于 cookie 的身份验证。 当用户在浏览器中没有身份验证 cookie 并尝试使用例如https://localhost:8080/admin/protected 访问剃须刀页面时 默认情况下,aspnet 核心框架重定向到 CookieAuthenticationOptions 中指定的 LoginPath。如果该 URL 类似于 /login,则浏览器会自动重定向到 /login?ReturnUrl=%2Fadmin%2Fprotected

太完美了。问题是我不知道以后应该如何工作,因为如果我的/login razor 页面提交了一个表单(例如它发布了用户名和密码),ReturnUrl 参数就会丢失。

保存它的“正确”方法是什么?我试图在文档中找到一些东西但没有成功,也找不到任何 asp 标签助手。

PS:我按照这个作为指导:https://www.mikesdotnetting.com/article/335/simple-authentication-in-razor-pages-without-a-database

【问题讨论】:

    标签: razor-pages


    【解决方案1】:

    我实施了一种解决方法,尽管它看起来“很麻烦”,并且我希望从 Razor 页面中获得一些语法糖来保留此 ReturnUrl。 无论如何,解决方案是在我的表单模型中包含一个字段,我将在页面呈现时存储ReturnUrl 查询参数(例如:获取请求)。例如:

    public class LoginForm
    {
        public string ReturnUrl { get; set; } = string.Empty;
    }
    

    在我的剃须刀页面代码中:

    public async Task OnGetAsync()
    {
        var nameValueCollection = HttpUtility.ParseQueryString(Request.QueryString.Value);
        const string returnUrlKey = "returnUrl";
        var returnUrl = nameValueCollection.Get(returnUrlKey);
        LoginForm.ReturnUrl = returnUrl; //here I save the value on the form
        // do other things
    }
    

    现在,在我的 razor 页面中,我添加了一个隐藏字段,以便在发布表单时将该值传递回服务器。例如:

    <form method="post">
      <input asp-for="LoginForm.ReturnUrl" type="hidden" />
      <button type="submit" asp-page-handler="Login">Login</button>
    </form>
    

    然后我可以访问原来的值

    public async Task<IActionResult> OnPostLoginAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }
        return Redirect(LoginForm.ReturnUrl);
    }
    

    请注意,即使存在验证错误并且 ModelState 无效,ReturnUrl 值也会保留,这正是我想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2011-11-04
      • 2018-10-20
      相关资源
      最近更新 更多