自定义Web Api授权数据库调用

时间:2015-03-20 17:09:52

标签: asp.net asp.net-web-api authorization claims-based-identity thinktecture-ident-model

我试图决定我写的自定义授权属性是不是一个好主意。

方案
假设我们有一个商店集合,每个Store都有一个所有者。只有商店的所有者才能在商店中进行CRUD操作。对于Claim的用户来说,除了基本上覆盖了所有权要求,并表示他们可以在任何商店进行CRUD操作。

旁注:我使用的是Thinktecture和ADFS

因此,我创建了一个StoreOwnerAuthorize属性,其参数("Manage", "Stores")用于检查用户是否具有适当的声明"覆盖"不是所有者,但仍能通过授权检查。

我不确定如何获得像#34; ManageStores"并在属性中进行数据库调用。它让我觉得我走错了路,尽管它确实完全符合我的需要。

API路线

api/v1/Store/{storeId:int:min(1)}/employees   
api/v1/Store/{storeId:int:min(1)}/inventory 

API方法

[StoreOwnerAuthorize("Manage", "Stores")]
[ResourceAuthorize("View", "Store")]
[Route("")]
//api/v1/Store/{storeId:int:min(1)}/employees 
public IHttpActionResult GetStoreEmployees(int storeId)
{
    return Ok(collectionOfStoreEmployees);
}

StoreOwnerAuthorizeAttribute

public class StoreOwnerAuthorizeAttribute : ResourceAuthorizeAttribute
{
    private readonly DbContext _context = new DbContext();

    public StoreOwnerAuthorizeAttribute(){  }
    public StoreOwnerAuthorizeAttribute(string action, params string[] resources)
        : base(action, resources) { }

    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        //If the user has the Claim that overrides the requirement that the user 
        //is the Owner of the Store, skip checking if they are the owner
        if (base.IsAuthorized(actionContext))
            return true;

        //Get route parameter to lookup Store and determine if the user is the owner
        object storeId;
        actionContext.ControllerContext.RouteData.Values.TryGetValue("storeId", out storeId);
        var isOwner = false;
        if (storeId != null)
        {
            isOwner =
                _context.Store_Get_ByStoreID(int.Parse(storeId.ToString()))
                    .Any(x => x.OwnerId == theUser.Id());
        }
        return isOwner;
    }
}

0 个答案:

没有答案