我目前正在构建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的基于资源的身份验证似乎是一个非常常见的问题,但是关于它的文章远远缺乏。