在Web Api中保护路由

时间:2014-04-27 18:48:50

标签: c# asp.net asp.net-mvc asp.net-web-api

我使用ASP.NET WebApi 2作为ASP.NET MVC 5应用程序的REST接口。

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

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

示例:客户可以访问此示例路由以查看订单。

http://host/api/customer/order/{orderId}

但是当另一个无法访问该订单的客户出现并尝试访问同一个端点时呢?

此外,我希望能够访问任何订单ID的管理员使用这些服务。

1 个答案:

答案 0 :(得分:3)

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

config.Filters.Add(new AuthorizeAttribute());

它会将[Authorize]属性应用于所有API端点。这样您就不会忘记保护API。

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

[AllowAnonymous]
[Route("register")]
public IHttpActionResult Post([FromBody] RegistrationModel model)
{
}

如果用户未登录过滤器,如果您没有AllowAnonymous属性,则会自动向您发出401错误。

如果有人试图访问他们不应该获得许可的{orderId},我只需在方法调用中使用基于声明的授权。像这样:

[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中安全性的一些good documentation。它有一些关于使用属性按角色阻止用户以及其他关于WebAPI授权的一般信息的内容。