2014-05-19 25 views
2

我正在做一个web api来处理遗留系统。这个web api的工作方式与旧的一样。安全性是随着每个呼叫一起发送安全令牌。这意味着我需要在提供数据之前检查令牌。我有这样的方法:如何在我的Web API 2解决方案中发送“禁止”响应?

public List<User> Get(string id, string securityToken) 
     { 
      //ValidateToken(securityToken); 
      return userRepository.LoadAll(); 
     } 

在我的方法,我想validateToken()方法返回一个“禁止”的HttpResponse如果我不能验证。我如何去做这件事?

+0

http://stackoverflow.com/questions/17201255/returning-http-403-in-a-webapi-method – Josh

回答

4

通常你会做在ActionFilterAttributeValidateToken呼叫类型,返回禁止在那个时候,很久以前被称为控制器上的Get方法。然后,您将该属性应用于控制器或操作方法(如果需要授权所有呼叫,则将其注册为全局操作筛选器属性)。

+1

+1这可能是这样做的,使用WebAPIs的比较正确的做法管道使其可重复使用。 – vcsjones

+0

@vcsjones你的答案也是有效的。我更喜欢这种方式的唯一原因是重用,因为授权往往是> 1方法调用的单个方案。 – Haney

6

您可以使用HttpResponseMessage像这样:

public HttpResponseMessage Get(string id, string securityToken) 
{ 
    var forbidden = true; 
    if (forbidden) 
    { 
     return this.Request.CreateResponse(HttpStatusCode.Forbidden); 
    } 
    return Ok(userRepository.LoadAll()); 
} 

使用HttpResponseMessage让你的内容,或者返回一个错误OK(一个HTTP 200)。

+12

感谢您的帮助!我的api返回IHttpActionResult,因此我需要使用'return StatusCode(HttpStatusCode.Forbidden);'代替。 –

+0

@JohnHenckel然而,对于一般的设计来说,这也是可能的,我认为这可能是一个更好的选择,像Haney提到的那样实现一个FilterAttribute,并尽可能地使用它。它是模块化的,它可以扩展,并且可以保持存储库和控制器的样板代码更清晰。因此,如果涉及复杂的逻辑来决定请求者是否被授权(在哪些过滤器可能不起作用),那么来自你们任一方的实现可能是有用的。 –

1

IHttpActionResult:

return StatusCode(HttpStatusCode.Forbidden); 

或者:

return Content(HttpStatusCode.Forbidden, "message"); 

HttpResponseMessage:

return this.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "message"); 

如果您想让自定义控制器像BadRequest()或其他任何响应那样执行Forbidden(),请参见此示例。

https://stackoverflow.com/a/28361376/3850405

相关问题