4

Вопрос по asp.net-mvc-3, asp.net-mvc – MVC 3 - доступ только для конкретного пользователя

В моем веб-приложении зарегистрированные пользователи могут добавлять новый контент и редактировать его позже. Я хочу, чтобы только автор контента мог его редактировать. Есть ли какой-нибудь разумный способ сделать это, кроме написания кода вручную во всех методах действия, который проверяет, является ли зарегистрированный пользователь тем же, что и автор? Любой атрибут, который я мог бы использовать для всего контроллера?

  • Контроллер или атрибут действия не будут иметь контекст отдельной публикации и автора, просто кто вошел в систему в целом. Вы лучше сравниваете автора с постом, описывающим действие по поиску атрибута, который позаботился бы о нем.

    от Brad Christie
  • 0

    Я мог бы:

    Save the db.aspnet_Users columm UserId (Guid) against the content record Write an extension method for your content model which verifies the current users Guid against the saved contents User Guid I would write some code that overrides this functionality for your Admin logins (I would create an Admin Role).

  • 6

    Any attribute that I could use for the whole controller?

    Да, вы могли бы продлитьAuthorize атрибут с пользовательским:

    public class AuthorizeAuthorAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var isAuthorized = base.AuthorizeCore(httpContext);
            if (!isAuthorized)
            {
                // the user is either not authenticated or
                // not in roles => no need to continue any further
                return false;
            }
    
            // get the currently logged on user
            var username = httpContext.User.Identity.Name;
    
            // get the id of the article that he is trying to manipulate
            // from the route data (this assumes that the id is passed as a route
            // data parameter: /foo/edit/123). If this is not the case and you 
            // are using query string parameters you could fetch the id using the Request
            var id = httpContext.Request.RequestContext.RouteData.Values["id"] as string;
    
            // Now that we have the current user and the id of the article he
            // is trying to manipualte all that's left is go ahead and look in 
            // our database to see if this user is the owner of the article
            return IsUserOwnerOfArticle(username, id);
        }
    
        private bool IsUserOwnerOfArticle(string username, string articleId)
        {
            throw new NotImplementedException();
        }
    }
    

    а потом:

    [HttpPost]
    [AuthorizeAuthor]
    public ActionResult Edit(int id)
    {
        ... perform the edit
    }