1

我有一个 Web 应用程序,它实现了最新的 Web API 作为基于 .NET 4.5 的主要基于 javascript/ajax 的 Web 应用程序的 restful 服务器。我正在使用表单身份验证及其工作,以保护 Web api 以及应用程序的其余部分。

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

我想做的是通过每个 api 请求传递用户 guid,如果该 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 而不是依赖于客户端发送的内容......但我不确定这是否适用于我的所有情况......因为我的申请还很年轻。

感谢您的时间!

4

1 回答 1

0

我目前正在整理一个使用不记名身份验证的 API(请参阅此处的 Microsoft 文档因为此处发布的细节太多)。

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

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

于 2014-10-15T14:51:59.380 回答