Web API资源授权

时间:2017-09-22 18:55:08

标签: c# asp.net-web-api asp.net-identity claims-based-identity

我目前正在构建Web API,但遇到了GET请求的授权问题。基本上我的问题是如何根据请求参数授权请求。我尝试过在线查找,但我能找到的唯一资源授权解决方案是创建自己的授权过滤器属性。因此,假设一个客户端属于Fac 8474,那么他们应该能够获得api/fac/8474。但是什么阻止用户获取api/fac/8475?下面的代码使用自定义身份验证过滤器来获取nId的用户声明值。获取请求的记录后,我检查记录上的nId值。如果它们相等,我允许访问,如果不是,我发送401未授权。但是,我必须为每个路径编写此代码,并且我不想为每个请求编写额外的代码,这可能包括更多逻辑,然后是简单的int检查。

class ClaimsAuthorizationFilter : AuthorizationFilterAttribute
        {
            public override Task OnAuthorizationAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
            {
                var principal = actionContext.RequestContext.Principal as ClaimsPrincipal;

                KeyValuePair<string, object> facId = actionContext.RequestContext.RouteData.Values.Where(p => p.Key == "facId").SingleOrDefault();
                Claim nIdClaim = principal.Claims.Where(p => p.Type == "nId").SingleOrDefault();

                if (nIdClaim == null) {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
                    return Task.FromResult<object>(null);
                }

                SM msg = ClientAPI.GenerateResponse("FAC_GET", Convert.ToInt32(facId.Value));
                dtoFac fac = (dtoFac)msg.Data;

                if (nIdClaim.Value != fac.nId.ToString())
                {
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
                    return Task.FromResult<object>(null);
                }
                return Task.FromResult<object>(null);
            }
        }

我也看过这个例子http://jakeydocs.readthedocs.io/en/latest/security/authorization/resourcebased.html基本上获取资源然后检查我也实现的nId并且它有效。

var identity = User.Identity as ClaimsIdentity;
Claim nId = identity.Claims.Where(p => p.Type == "nId").SingleOrDefault();

if (nId == null) {
     return NotFound();
}

// Get list of resources named bat

if (!IEnumAuthCheck(bat, nId.Value)) {
     return NotFound();
}

private bool IEnumAuthCheck(IEnumerable<bat> list, string nId)
    {
        foreach (bat element in list)
        {
            if (element.nId != Convert.ToInt32(nId))
            {
                return false;
            }
        }
        return true;
    }

我的主要问题是,解决此问题的建议模式是什么?对于id的基于资源的身份验证似乎是一个非常常见的问题,但是关于它的文章远远缺乏。

0 个答案:

没有答案