2012-02-28 88 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(); 
    } 
} 

你可以看到我一直在尝试,控制器和动作都在我的属性,但它没有烧制的任何一个。我在我的授权属性函数中设置了一个断点,并没有被调用。

我很确定斯科特格思里说这是行得通的。我做错了,还是我需要一种完全不同的方法来确保这些?

回答

3

要与DataControllerApiController您的属性派生的任何其他类型的工作,必须从System.Web.Http.AuthorizeAttribute

+0

感谢您的答复派生。这与System.Web.Mvc.AuthorizeAttribute有很大不同。除此之外,互联网上还没有任何关于这一点的内容,除非是msdn对其存在的简要承认。 我的第一个问题是,这种类型的属性是否也适用于我的正常mvc操作?或者我需要一个重复的授权属性类吗? – GeekyMonkey 2012-02-28 10:11:30

+0

在测试版中,是的,你需要属性的类型,一个用于MVC控制器,另一个用于API控制器。我们正在考虑在enxt中降低这个问题。 – marcind 2012-02-28 16:12:16

+0

我已经决定通过创建一个自定义的RoleProvider来避开这个问题,然后把它放在我的DbDataController顶部,使用AuthorizeAttribute ='System.Web.Http.AuthorizeAttribute';' 然后我可以把它放在我的数据动作或类) '[Authorize(Roles =“SuperAdmin”)]' 它没有做我所需要的一切,但它是一个开始。在某些情况下,我需要查找用户记录来检查他们是否可以访问特定的记录,所以这不会削减它。 如果我们有相同的MVC过滤器可以使用这些新控制器,那将会更好。 – GeekyMonkey 2012-02-28 16:48:08