C# Web API资源授权
我目前正在构建一个Web API,但在GET请求中遇到了授权问题。本质上,我的问题是如何根据请求参数授权请求。我尝试过在线查找,但我能找到的资源授权的唯一解决方案是创建自己的授权筛选器属性。假设客户机属于Fac 8474,那么他们应该能够获得C# Web API资源授权,c#,asp.net-web-api,asp.net-identity,claims-based-identity,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未经授权。但是
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);
}
}
class ClaimsAuthorizationFilter:AuthorizationFilterAttribute
{
AuthorizationAsync上的公共重写任务(HttpActionContext actionContext,System.Threading.CancellationToken CancellationToken)
{
var principal=actionContext.RequestContext.principal作为ClaimsPrincipal;
KeyValuePair facId=actionContext.RequestContext.RoutedData.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);
返回Task.FromResult(空);
}
SM msg=ClientAPI.generatereresponse(“FAC_GET”,Convert.ToInt32(facId.Value));
dtoFac fac=(dtoFac)msg.Data;
if(nIdClaim.Value!=fac.nId.ToString())
{
actionContext.Response=actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
返回Task.FromResult(空);
}
返回Task.FromResult(空);
}
}
我还看了这个例子,本质上是获取资源,然后检查我也实现了的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;
}
var identity=User.identity作为索赔实体;
Claim nId=identity.Claims.Where(p=>p.Type==“nId”).SingleOrDefault();
if(nId==null){
返回NotFound();
}
//获取名为bat的资源列表
如果(!IEnumAuthCheck(bat,nId.Value)){
返回NotFound();
}
私有布尔IEnumAuthCheck(IEnumerable列表,字符串nId)
{
foreach(列表中的bat元素)
{
if(element.nId!=转换为32(nId))
{
返回false;
}
}
返回true;
}
我的主要问题是,解决这个问题的推荐模式是什么?基于资源的ID身份验证似乎是一个非常常见的问题,但关于它的文章远远不够。但是是什么阻止了用户获得api/fac/8475
为什么要阻止用户?根据授权,您是否可以找到记录。如果您没有:返回NotFound。它是否增加了返回401的值?如果您不想猜测url,请使用guid作为id。根据授权,您可以查找记录,也可以不查找记录。是的,所以我的问题是,有没有推荐的记录授权模式。我看了这个例子,似乎人们遵循的模式是1。检索记录2。确定userId是否与找到的记录3相关。根据结果返回真/假。4.对每个需要授权的方法执行此调用。但是是什么阻止用户获取api/fac/8475为什么停止用户?根据授权,您是否可以找到记录。如果您没有:返回NotFound。它是否增加了返回401的值?如果您不想猜测url,请使用guid作为id。根据授权,您可以查找记录,也可以不查找记录。是的,所以我的问题是,有没有推荐的记录授权模式。我看了这个例子,似乎人们遵循的模式是1。检索记录2。确定userId是否与找到的记录3相关。根据结果返回真/假。4.对每个需要授权的方法执行此调用。