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
与postModel.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
与postModel.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方法上,您希望再次执行此检查。