asp.net 从表单传递返回URL

nnsrf1az  于 4个月前  发布在  .NET
关注(0)|答案(1)|浏览(65)

我试图将返回url的值从视图中传递到相应控制器中的action方法。在action方法中,我使用ModelState.IsValid进行服务器端验证检查,每次返回url都是无效的。我不知道问题是什么。
这是我的form元素:

<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" role="form">
    <h4>Use a local account to log in.</h4>
    <hr />
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Email" class="col-md-2"></label>
        <div class="col-md-10">
            <input asp-for="Email" class="form-control" />
            <span asp-validation-for="Email" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <label asp-for="Password" class="col-md-2"></label>
        <div class="col-md-10">
            <input asp-for="Password" class="form-control" />
            <span asp-validation-for="Password" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-10">
            <div class="custom-checkbox">
                <label asp-for="RememberMe">
                    <input asp-for="RememberMe" />
                    @Html.DisplayNameFor(x => x.RememberMe)
                </label>
            </div>
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-2">
            <button type="submit" class="btn btn-success form-control">Log in</button>
        </div>
    </div>
    <p>
        <a asp-controller="Account" asp-action="Register">Register as a new user?</a>
    </p>
    <p>
        <a asp-controller="Account" asp-action="ForgotPassword">Forgot your password?</a>
    </p>
</form>

字符串
这就是行动方法:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnurl = null)
{
    ViewData["ReturnUrl"] = returnurl;
    returnurl = returnurl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, isPersistent: model.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            return LocalRedirect(returnurl);
        }
        else if (result.IsLockedOut)
        {
            return View("Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return View(model);
        }
    }

    return View(model);
}


我希望了解为什么Rumnurl参数不能从视图中的表单中获取任何内容

6pp0gazn

6pp0gazn1#

我正在用ModelState.IsValid做服务器端验证检查,每次返回的URL都是无效的。我不知道问题出在哪里。
好吧,根据你的场景描述和共享的代码片段,我有treid重现你的问题.关于你的无效URL一个问题来考虑是,你得到的URL是什么?
这是我们应该指出的另一个额外用例。
首先,由于您使用的是LocalRedirect,因此您的URL是本地的,因此除了基本或本地URL之外的任何URL都将被视为无效URL。因为,当您尝试访问授权资源但未经过身份验证或授权时,returnUrl通常会自动填充。
当您尝试未经授权的访问时,安全中间件会将您重定向到设置了returnUrl的登录页面,但当发现非本地URL时,LocalRedirect会抛出异常。您可以看到下面:


的数据
我希望了解为什么Rumnurl参数不能从视图中的表单中获取任何内容
如前所述,当您点击登录页面时,它通常会自动填充基本的本地URL。然而,您可以手动传递,然后可以检查本地URL。因此,如果您想过滤它们,那么为了克服异常,您可以在检查用户登录时在登录控制器中包含以下条件result = await _signInManager.PasswordSignInAsync()

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginViewModel model, string returnurl = null)
        {
            ViewData["ReturnUrl"] = returnurl;
            returnurl = returnurl ?? Url.Content("~/");
    
            var checkIfLocaURL = Url.IsLocalUrl(returnurl);
            if (ModelState.IsValid)
            {
    
                if (!string.IsNullOrEmpty(returnurl) && Url.IsLocalUrl(returnurl))
                {
                    return LocalRedirect(returnurl);
    
                }
                else
                {
                    return Redirect(returnurl);
                }
    
            }
    
            return View("Index");
        }
    }

字符串
输出量:


**注意:**默认加载登录索引时,会填充/的基本路径。如果您想了解更多,请参考此官方文档。对于redirectLocal check this.

相关问题