WebApi OData EntitySetController上的自定义AuthorizeAttribute

时间:2014-12-25 12:29:33

标签: asp.net-web-api odata authorize-attribute

我创建了自定义authorize属性来处理从EntitySetController继承的WebAPI odata控制器的自定义权限,这是我的属性的代码

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public class RequirePermissionsAttribute : System.Web.Http.AuthorizeAttribute
{
    public Permissions[] Permissions { get; set; }


    public RequirePermissionsAttribute()
    { }

    public RequirePermissionsAttribute(params Permissions[] permissions)
    {
        this.Permissions = permissions;
    }

    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
       // Custom  authorization logic
    }

现在我尝试在Get()方法上添加此属性,它被调用

public class ItemsController : EntitySetController<Item, Guid>
{
   [EnableQuery(MaxExpansionDepth = 5)]
   [RequirePermissionsAttribute(Permissions.ViewAll)]
   public override IQueryable<Item> Get()
   {
     //Code go here
   }
}

但是当我在CreateEntity()上添加相同的属性时,它永远不会被调用

[RequirePermissionsAttribute(Permissions.Add)]
protected override Item CreateEntity(Item item)
{
  // Create item
}

任何帮助表示赞赏

2 个答案:

答案 0 :(得分:0)

你应该使用你的属性作为RequirePermissions,而不是tard&#34;属性&#34;单词,所以改变你的代码就像这样

[RequirePermissions(Permissions.Add)] protected override Item CreateEntity(Item item) { // Create item }

答案 1 :(得分:0)

伊斯兰

从WebAPI源代码中,在POST请求中调用内部虚拟函数CreateEntity()。以下是EntitySetController中的源代码:

public virtual HttpResponseMessage Post([FromBody] TEntity entity)
{
    TEntity createdEntity = CreateEntity(entity);
    TKey entityKey = GetKey(entity);
    return EntitySetControllerHelpers.PostResponse(this, createdEntity, entityKey);
}

我使用您的示例代码并发送POST请求,CreateEntity()可以调用为:

POST ~/odata/Items

Content-type: application/json

{"Id":"9daf653f-212c-42e3-80a4-4778e445c092"}

enter image description here

但是,如果您想获得正确的回复,则应覆盖GetKey(),因为在GetKey()方法CreateEntity()之后调用了Post()CreateEntity()的评论中也提到了相同的信息,如下所示:

enter image description here

样本测试

我在ItemsController中创建了以下两个函数:

protected override Guid GetKey(Item entity)
{
    return entity.Id;
}

[RequirePermissionsAttribute(Permissions.Add)]
protected override Item CreateEntity(Item item)
{
    // Create item
    return item;
}

并发送上述相同的POST请求,我可以得到以下响应:

HTTP/1.1 201 Created
Cache-Control: no-cache
.....
Content-Length: 124

{
  "odata.metadata":"http://localhost:47794/odata/$metadata#Items/@Element","Id":"9daf653f-212c-42e3-80a4-4778e445c092"
}

希望它可以帮到你。感谢。