2016-03-07 5 views
-1

У меня есть некоторые вопросы относительно редактирования/удаления операции с помощью asp.net mvc или веб-приложений в целом.ASP.NET MVC 4 редактирование/удаление операции

Допустим, у меня есть следующий URL-адрес для удаления или редактирования записей: приложение/удалить/5, приложение/редактировать/5, чтобы изменить или удалить запись с идентификатором 5.

При вызове по ссылке, страница подтверждение загружается через HTTP GET, а сама операция edit/delete выполняется через HTTP POST.

Как только пользователь узнает ссылку, как я могу запретить ему звонить в любое другое приложение/удалить или приложение/редактировать записи, которые он не имеет или не может редактировать или удалять? Пример: app/delete/7312

Что мне нужно включить в действие моего контроллера, что пользователь может только получить страницу подтверждения через GET для записей, которые ему разрешено выполнить для редактирования/удаления?

С наилучшими пожеланиями МАРК

+5

Внедрение аутентификации и авторизации. – CodeCaster

+0

Посмотрите на использование атрибута '[Authorize]' – Alex

+0

'[Авторизовать]' работает только в том случае, если вы можете назначить набор разрешенных ролей пользователя для действия. Но OP хочет запретить удаление в зависимости от владельца данных. –

ответ

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; } 
    } 

Затем в базе данных контекста класса, вы можете перезаписать сохранить изменения автоматически отслеживать эти вещи, когда пользователь в системе сохраняет что-то для заполнения эти поля. Это удобно, потому что вам не нужно входить в Create, Edit и т. Д. И вручную связывать это.

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()). Имя равно на имя того, кто создал модель.

Я знаю, что это много, если у вас есть вопросы, прокомментируйте, пожалуйста, зарегистрируйтесь.