Как реализовать настраиваемый атрибут Authorize для следующего случая?

17

, поэтому у меня есть свой метод действий

[Authorize(Roles="Admin")]
public ActionResult EditPosts(int id)
{
    return View();
}

В моем случае мне нужно авторизовать администраторов, чтобы они могли редактировать сообщения, но (здесь идет крутая часть), я также должен разрешить создателю сообщения иметь возможность редактировать сообщение, которое является обычным пользователем. Итак, как я могу отфильтровать пользователя, создавшего сообщение, а также администраторов, но оставив остальных несанкционированными? Я получаю идентификатор PostEntry в качестве параметра маршрута, но после атрибута, а также атрибуты принимают только постоянные параметры, выглядит как-то очень сложно, ваши ответы высоко ценятся, Cheers!

    
задан Freeman 15.07.2012 в 19:02
источник

1 ответ

39

Вы можете написать собственный атрибут authorize:

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;
        if (user.IsInRole("Admin"))
        {
            // Administrator => let him in
            return true;
        }

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["id"] as string;
        if (string.IsNullOrEmpty(id))
        {
            // No id was specified => we do not allow access
            return false;
        }

        return IsOwnerOfPost(user.Identity.Name, id);
    }

    private bool IsOwnerOfPost(string username, string postId)
    {
        // TODO: you know what to do here
        throw new NotImplementedException();
    }
}

, а затем украсить его действие с ним:

[AuthorizeAdminOrOwnerOfPost]
public ActionResult EditPosts(int id)
{
    return View();
}
    
ответ дан Darin Dimitrov 15.07.2012 в 19:30
источник