2013-10-17 79 views
1

我有一个Web应用程序已经实现了最新的Web API作为基于JavaScript/Ajax的基于.NET 4.5构建的Web应用程序的宁静服务器。我正在使用表单身份验证和它的工作,因为它应该保证网络API以及应用程序的其他部分。Web API扩展安全

我想向Web API添加另一层安全性,以防止用户在手动向API请求中使用其他用户guid。他们必须在另一个登录用户的浏览器中查看源代码,才能从隐藏的输入中获取该用户的guid。然后,他们可能会使用该GUID通过他们自己的认证会话访问其他用户的数据。当然,这个坏人必须在他们自己的帐户下进行身份验证才能发挥作用。

我在做的是传递用户GUID每个API请求,如果该GUID匹配HttpContext.Current.User.Identity.Name然后允许请求...否则抛出一个未经授权的异常,并处理它相应的客户。但是接下来我的所有处理方法都变得有些肮脏了,如下所示...在大多数情况下,这将不得不在每个GET,POST,PUT等中以及其他对象中。

public Community Get(string userGuid) 
    { 
     if (HttpContext.Current.User.Identity.Name == userGuid) 
      return myDataHandler.getUserData(); 
     else 
      throw new HttpResponseException(HttpStatusCode.Unauthorized); 
    } 

我可以做这个工作,但它似乎有点太多的开销。我已经浏览了许多关于web api安全性的文章和文章,但没有涉及这种潜在的情况。验证每个请求的最佳方法是实际请求关于用户登录的信息,而不必执行上面的操作。可能使用这个想法,但为每个API请求全局执行,而不是在每种方法中都进行测试?解决这个问题的另一种方法是为每个请求使用HttpContext.Current.User.Identity.Name,而不是依赖从客户端发送的内容......但我不确定这将适用于所有情况...... as我的申请还很年轻。

谢谢你的时间!

回答

0

我目前正在使用承载验证的API(请参阅微软文档here,因为这里有太多的细节可以发布)。

我正在使用的一件事是索赔,而我设定的其中一项索赔是构成用户身份一部分的用户ID。当某人使用API​​进行身份验证时,声明也会设置(从令牌读取),并且可以从用户上下文访问,就像您当前访问名称一样。

通过这样做,您不需要将Guid存储在隐藏字段中。