C# 在WebApi中保护路由
我使用ASP.NETWebAPI 2作为ASP.NETMVC5应用程序的REST接口 我正在使用Forms Auth进行身份验证 我的问题是,保护在不同用户上下文中使用参数的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应该是
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
来自哪里?对不起,我只是用整件布编造出来的。我假设您将调用后端服务来获取订单,并且在该订单上,您将具有某种类型的属性来表示您可以与用户声明相匹配的所有权。