试图提交表单作为未授权的用户时的问题



对不起标题,但我不知道如何仅用一个句子来解释它。我有一个形式的视图:

@using (Html.BeginForm("AddComment", "Restaurants"))
{
    @Html.TextBoxFor(c => c.NewComment.Body)
    @Html.HiddenFor(m => m.Restaurant.Id)
    <button type="submit">Add comment</button>
}

和餐馆控制器中的加法操作:

public ActionResult AddComment(RestaurantViewModel model, Comment newComment)
{
    var userId = User.Identity.GetUserId();
    var user = _context.Users.FirstOrDefault(u => u.Id == userId);
    newComment.RestaurantId = model.Restaurant.Id;
    newComment.AuthorId = Guid.Parse(userId);
    newComment.AuthorName = user.UserName;
    newComment.DateTime = DateTime.Now;
    _context.Comments.Add(newComment);
    _context.SaveChanges();
    return RedirectToAction("Details", "Restaurants", new { id = model.Restaurant.Id});
}

我添加了授权过滤器:

filters.Add(new AuthorizeAttribute());

当我尝试提交未记录的用户表单时,它将我重定向到登录页面。如果我在该页面上登录,它将调用AddComment操作,但它将参数Model.RestaurantNewComment.Body作为nulls传递。如何修复它,因此,当我登录时,它将我重定向到上一页,或者只需致电AddComment,但是传递了参数的正确值。

没有内置的方法可以做到这一点。原因是,这不是"做事的方式"。如果您的表格有安全后的操作,请同时进行相应的GET页面。

尝试删除此行:

filters.Add(new AuthorizeAttribute());

并将符号[Authorize]添加到您的方法中,例如:

[Authorize]
public ActionResult AddComment(RestaurantViewModel model, Comment newComment)
{
    var userId = User.Identity.GetUserId();
    var user = _context.Users.FirstOrDefault(u => u.Id == userId);
    newComment.RestaurantId = model.Restaurant.Id;
    newComment.AuthorId = Guid.Parse(userId);
    newComment.AuthorName = user.UserName;
    newComment.DateTime = DateTime.Now;
    _context.Comments.Add(newComment);
    _context.SaveChanges();
    return RedirectToAction("Details", "Restaurants", new { id = model.Restaurant.Id});
}

我不建议在最简单的情况之外这样做。您可以更改表格以使用get代替post

@using (Html.BeginForm("AddComment", "Restaurants", FormMethod.Get))
{
    @Html.TextBoxFor(c => c.NewComment.Body)
    @Html.HiddenFor(m => m.Restaurant.Id)
    <button type="submit">Add comment</button>
}

警告:

  • 只有在使用内置的auth或您的实现向querystring值时,这才能工作。
  • 其次,这些值将在URL中,因此可以轻松篡改它们。
  • 最后但并非最不重要的一点,如果AddComment具有HttpPost属性,则必须删除。

相关内容

  • 没有找到相关文章