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

C# 检查登录用户是否与登录用户相同,c#,asp.net-mvc,C#,Asp.net Mvc,我正在开发一个论坛并尝试创建一个“编辑页面”,但我只希望创建帖子的用户能够看到“编辑控件”,并且是唯一能够编辑其页面的用户。我该怎么做 这就是我现在的成就: @if (WHAT TO TYPE HERE) { @Html.ActionLink("Edit", "Edit", "Threads", new { @id = Model.Id }, null) } 您需要将当前用户与文章的原始作者进行比较。我想你有数据库吧 假设您有一个论坛线程/帖子的模型: public class For

我正在开发一个论坛并尝试创建一个“编辑页面”,但我只希望创建帖子的用户能够看到“编辑控件”,并且是唯一能够编辑其页面的用户。我该怎么做

这就是我现在的成就:

@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
字段应该包含创建帖子的人的用户名。查看帖子时,您应该:

  • 从您的存储库中检索此文件
  • 将当前用户
    HttpContext.current.user.Identity.Name
    与post
    Model.author的作者进行比较
  • 如果要在视图中执行此操作,可以按如下方式执行:

    @if (HttpContext.Current.User.Identity.Name.Equals(Model.Author))
    {
        @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
    字段应该包含创建帖子的人的用户名。查看帖子时,您应该:

  • 从您的存储库中检索此文件
  • 将当前用户
    HttpContext.current.user.Identity.Name
    与post
    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))
    
    在视图中执行此检查是完全正确的,因为您认为这纯粹是一个UX功能:此开关的作用应该只是使按钮可见,您不应该给它任何安全问题

    “是否允许用户编辑帖子”的安全性始终要在“编辑控制器”操作中进行检查,您必须再次进行此检查。
    总是检查谁可以在该方法的开始处执行一个动作。

    如果还没有在其他地方做过,首先检查用户是否被认证,然后考虑使用什么样的身份验证(你应该在你的问题中给出更多的细节)。例如,如果使用windows身份验证,则属性“User.Identity.Name”也包含域

    if (HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.Identity.Name.Equals(Model.Author))
    
    在视图中执行此检查是完全正确的,因为您认为这纯粹是一个UX功能:此开关的作用应该只是使按钮可见,您不应该给它任何安全问题

    “是否允许用户编辑帖子”的安全性始终要在“编辑控制器”操作中进行检查,您必须再次进行此检查。
    始终在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);
            }
    
    视图:

    成功了:)


    谢谢你所有的回答

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

    控制器:

        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);
            }
    
    视图:

    成功了:)


    感谢您的所有回答

    此处键入的内容
    应替换为
    此帖子是否由当前登录的用户创建
    您应将当前用户与创建帖子的用户进行比较。我想你的论坛后面有一个数据库吧?然后您应该将当前用户(
    HttpContext.current.user.Identity.Name
    )与
    Model.Author
    (如果您有相应的字段)进行比较。我将把用户/用户名放在视图模型中。尽量使用强类型视图和视图模型。您的视图现在已“绑定”到HttpContext对象。是。是asp.net MVCW。我们需要有关您的模型的更多信息,或者您如何能够识别线程创建者。无论如何,您都不希望在视图中进行此检查。将其设置为模型属性(
    ShowEditLink
    或其他任何属性),并计算控制器中的权限。因为在Edit GET and POST action方法中,您希望再次执行此检查。
    此处键入的内容应替换为
    此帖子是否由当前登录的用户创建
    您应将当前用户与创建帖子的用户进行比较。我想你的论坛后面有一个数据库吧?然后您应该将当前用户(
    HttpContext.current.user.Identity.Name
    )与
    Model.Author
    (如果您有相应的字段)进行比较。我将把用户/用户名放在视图模型中。尽量使用强类型视图和视图模型。您的视图现在已“绑定”到HttpContext对象。是。是asp.net MVCW。我们需要有关您的模型的更多信息,或者您如何能够识别线程创建者。无论如何,您都不希望在视图中进行此检查。将其设置为模型属性(
    ShowEditLink
    或其他任何属性),并计算控制器中的权限。因为在Edit GET和POST action方法上,您希望再次执行此检查。