检查登录用户是否与登录用户相同

本文关键字:用户 登录 是否 检查 | 更新日期: 2023-09-27 18:27:14

我正在开发一个论坛,并试图创建一个"编辑页面"。但我只想让创建帖子的用户能够看到"编辑控件"

这就是我现在的处境:

@if (WHAT TO TYPE HERE)
{
    @Html.ActionLink("Edit", "Edit", "Threads", new { @id = Model.Id }, null)
}

在评论中添加了答案

检查登录用户是否与登录用户相同

您需要将当前用户与文章的原始作者进行比较。我想你有数据库吧?

假设你有一个论坛线程/帖子的模型:

public class ForumPost
{
    public int Id { get; set; }
    public string Author { get; set; }
    // [...] Additional fields.
}

例如,Author字段应该包含创建帖子的用户的用户名。查看帖子时,您应该:

  1. 从存储库中检索
  2. 将当前用户HttpContext.Current.User.Identity.Name与帖子Model.Author的作者进行比较

如果你想在你看来做到这一点,你可以这样做:

@if (HttpContext.Current.User.Identity.Name.Equals(Model.Author))
{
    @Html.ActionLink("Edit", "Edit", "Threads", new { @id = Model.Id }, null)
}

我没有带编译器,但这段代码应该可以工作。

然而,我不建议直接这样做。您应该创建一个视图模型,其中包含满足视图要求的所有必要字段。

如果还没有在其他地方进行,请首先检查用户是否经过身份验证,然后考虑您正在使用的身份验证类型(您应该在问题中提供更多详细信息)。例如,如果您使用windows身份验证,则属性"User.Identity.Name"也包含域

if (HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.Identity.Name.Equals(Model.Author))

在视图中进行这种检查是完全可以的,因为你已经意识到这纯粹是一个用户体验功能:这个开关的作用应该只是让按钮可见,你不应该给它任何安全问题。

"是否允许用户编辑帖子"的安全性必须在编辑控制器操作的后端进行检查,您必须再次进行此检查。始终在Get方法的开头检查谁能够执行某个操作。

好的,谢谢你的回答,但我找到了另一种方法,我做的方法是

控制器:

    public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Thread thread = db.Threads.Find(id);
            string userId = User.Identity.GetUserId();
            if (thread == null || thread.ApplicationUserId != userId)
            {
                return HttpNotFound();
            }
            ViewBag.CategoryId = new SelectList(db.Categorys, "Id", "Title", thread.CategoryId);
            return View(thread);
        }
        [HttpPost]
        [ValidateInput(false)]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Id,Title,Content,CategoryId")] Thread thread)
        {
            if (ModelState.IsValid)
            {
                Thread t = db.Threads.Include(m => m.ApplicationUser).FirstOrDefault(m => m.Id == thread.Id);
                t.Content = thread.Content;
                t.Title = thread.Title;
                db.Entry(t).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Post", "Threads", new { @id = thread.Id });
            }
            return View(thread);
        }

视图:

@if (Model.ApplicationUserId == User.Identity.GetUserId())
        {
            @Html.ActionLink("Edit", "Edit", "Threads", new { @id = Model.Id }, null)
        }

起作用了:)

感谢您的所有回复