C# 在WebApi中保护路由

C# 在WebApi中保护路由,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,我使用ASP.NETWebAPI 2作为ASP.NETMVC5应用程序的REST接口 我正在使用Forms Auth进行身份验证 我的问题是,保护在不同用户上下文中使用参数的WebApi路由的最佳方法是什么 示例:客户可以访问此示例路线来查看订单 http://host/api/customer/order/{orderId} 但是,当另一个无法访问该订单的客户出现并试图访问同一个端点时,该怎么办 此外,我希望服务能够由管理员使用,管理员可以访问任何订单id。首先,默认情况下,您的API应该是

我使用ASP.NETWebAPI 2作为ASP.NETMVC5应用程序的REST接口

我正在使用Forms Auth进行身份验证

我的问题是,保护在不同用户上下文中使用参数的WebApi路由的最佳方法是什么

示例:客户可以访问此示例路线来查看订单

http://host/api/customer/order/{orderId}
但是,当另一个无法访问该订单的客户出现并试图访问同一个端点时,该怎么办


此外,我希望服务能够由管理员使用,管理员可以访问任何订单id。

首先,默认情况下,您的API应该是安全的。在WebAPI配置文件中添加这一行

config.Filters.Add(new AuthorizeAttribute());
它将[Authorize]属性应用于所有API端点。这样您就不会忘记保护API

如果希望所有匿名用户都能使用端点,请使用如下[AllowAnonymous]属性:

[AllowAnonymous]
[Route("register")]
public IHttpActionResult Post([FromBody] RegistrationModel model)
{
}
[Route("getProtectedThing")]
public IHttpActionResult Get()
{
   var order = getOrder(orderId);
   if(ClaimsPrinciple.Current.Claims.First(x => x.Type == ClaimsTypes.NameIdentifier).Value 
        == order.memberId || 
        ClaimsPrinciple.Current.Claims.FirstOrDefault(x => x.Type == "IsAdmin").Value)
   {
      return Ok("data");
   }
   return Unauthorized();
}
如果用户未登录,如果您没有AllowAnonymous属性,则筛选器将自动给出401错误

如果有人试图访问他们不应该拥有权限的{orderId},我只会在方法调用中使用基于声明的授权。大概是这样的:

[AllowAnonymous]
[Route("register")]
public IHttpActionResult Post([FromBody] RegistrationModel model)
{
}
[Route("getProtectedThing")]
public IHttpActionResult Get()
{
   var order = getOrder(orderId);
   if(ClaimsPrinciple.Current.Claims.First(x => x.Type == ClaimsTypes.NameIdentifier).Value 
        == order.memberId || 
        ClaimsPrinciple.Current.Claims.FirstOrDefault(x => x.Type == "IsAdmin").Value)
   {
      return Ok("data");
   }
   return Unauthorized();
}
我希望这能回答这个问题。我很确定你可以在使用过滤器点击方法之前进行索赔检查。但我从来没有在我的应用程序中需要如此通用的东西


下面是一些关于WebApi安全性的信息。它有一些关于使用属性按角色阻止用户的内容,以及关于WebAPI中授权的其他一般信息

orderId.memberId
来自哪里?对不起,我只是用整件布编造出来的。我假设您将调用后端服务来获取订单,并且在该订单上,您将具有某种类型的属性来表示您可以与用户声明相匹配的所有权。