2012-02-28 2 views
0

Я пытаюсь использовать новый MVC4 DbDataController, чтобы разоблачить неудовлетворительные данные api.Авторизовать Атрибут не фильтруется на DbDataController

Моя проблема заключается в том, чтобы обеспечить это. Я создал атрибуты пользовательских авторизации, которые проистекают из Авторизоваться Атрибут

public class AdminOnlyAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
    if (!IsAllowed()) { 
     filterContext.Result = new HttpUnauthorizedResult("Not logged in"); 
    } 
    ... 
} 

И это прекрасно работает, когда применяется к моим нормальным действиям контроллера. Я пытаюсь использовать то же самое в моей службы данных, как это:

[AdminOnlyAttribute] 
public class DataServiceController : DbDataController<AppBuilderDataContext> 
{ 
    [AdminOnlyAttribute] 
    public IQueryable<Thing> GetThings() 
    { 
    return DbContext.AllMyThings(); 
    } 
} 

Вы можете видеть, что я попробовал мой атрибут как контроллер и действие, но это не для стрельбы ни один. Я установил точку останова внутри моей функции атрибута authorize, и она не вызвана.

Я уверен, что Скотт Гатри сказал, что это сработает. Я делаю это неправильно или мне нужен совершенно другой метод для их защиты?

ответ

3

Для работы с DataController или любым другим типом, производным от ApiController атрибута вашего должен быть производным от System.Web.Http.AuthorizeAttribute

+0

Спасибо за ответ. Это немного отличается от System.Web.Mvc.AuthorizeAttribute. В этом нет ничего об этом, кроме краткого сообщения о его существовании. Мой первый вопрос: будет ли этот тип атрибутов работать и на мои обычные действия mvc? Или мне понадобится дублирующий класс атрибутов авторизации? – GeekyMonkey

+0

В бета-версии да, вам понадобятся типы атрибутов, один для контроллеров MVC, другой для контроллеров API. Мы смотрим на улучшение этого в сокращении enxt. – marcind

+0

Я решил обойти проблему, создав пользовательский RoleProvider, а затем положив это на вершину своего DbDataController 'using AuthorizeAttribute = System.Web.Http.AuthorizeAttribute;' Теперь я могу поместить это в действие моих данных (или класс) '[Авторизовать (Роли =« СуперAdmin »)]' Он не делает все, что мне нужно, но это начало. В некоторых случаях мне нужно будет найти запись пользователя, чтобы проверить, могут ли они получить доступ к определенным записям, поэтому это не приведет к ее сокращению. Было бы намного лучше, если бы те же фильтры MVC, которые у нас были, будут работать с этими новыми контроллерами. – GeekyMonkey

Смежные вопросы