我创建了自定义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
}
任何帮助表示赞赏
答案 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"}
但是,如果您想获得正确的回复,则应覆盖GetKey()
,因为在GetKey()
方法CreateEntity()
之后调用了Post()
。 CreateEntity()
的评论中也提到了相同的信息,如下所示:
样本测试
我在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"
}
希望它可以帮到你。感谢。