我对通过asp.net mvc或web应用程序编辑/删除操作有一些疑问。
让我说我有以下网址删除或编辑记录:app / delete / 5,app / edit / 5编辑或删除id为5的记录。
调用链接时,通过HTTP GET加载确认页面,编辑/删除操作本身通过HTTP POST完成。
一旦用户知道该链接,我如何阻止他调用任何其他应用/删除或应用/编辑他不拥有或不允许编辑/删除的记录?示例:app / delete / 7312
我必须在控制器操作中添加什么,用户只能通过GET获取确认页面以获取允许执行编辑/删除的记录?
祝你好运 渣
答案 0 :(得分:0)
首先我发布了一个更简单的答案,但我没有理解这个问题。你需要两件事。一种了解谁在系统中创建了什么,然后在删除操作中检查当前用户是否等于创建它的用户的一些业务逻辑的方法。我建议使用这个可继承的类来跟踪对象的所有权:
public class BaseEntity
{
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = false)]
[Display(Name = "Date Created")]
[DataType(DataType.Date)]
public DateTime? DateCreated { get; set; }
public string UserCreated { get; set; }
[Display(Name = "Date Modified")]
[DataType(DataType.Date)]
public DateTime? DateModified { get; set; }
public string UserModified { get; set; }
}
然后,在数据库上下文类中,只要系统中的用户保存了填充这些字段的内容,就可以覆盖保存更改以自动跟踪这些内容。这很方便,因为您不必进入创建,编辑等手动链接。
public override int SaveChanges()
{
var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseEntity && (x.State == EntityState.Added || x.State == EntityState.Modified));
var currentUsername = HttpContext.Current != null && HttpContext.Current.User != null
? Users.Find(HttpContext.Current.User.Identity.GetUserId()).Name
: "Anonymous";
foreach (var entity in entities)
{
if (entity.State == EntityState.Added)
{
((BaseEntity)entity.Entity).DateCreated = DateTime.Now;
((BaseEntity)entity.Entity).UserCreated = currentUsername;
}
((BaseEntity)entity.Entity).DateModified = DateTime.Now;
((BaseEntity)entity.Entity).UserModified = currentUsername;
}
return base.SaveChanges();
}
最后,为了实际实现您的功能,您可以在控制器的删除操作中,只有当Users.Find(HttpContext.Current.User.Identity.GetUserID())。name相等时才允许删除操作以创建模型的人的名义。
我知道这很多,如果您有任何疑问,请发表评论我会办理登机手续。