Web 服务的基于令牌的安全性

本文关键字:令牌 安全性 于令牌 服务 Web | 更新日期: 2023-09-27 18:33:28

我正在使用Web API 2编写C# Web服务,其中某些CRUD操作需要基于用户订阅具有一些安全性。

每个用户都有一个唯一的字符串令牌作为其订阅的一部分。

在我为 Web 服务安全编写代码之前,有人可以告诉我以下是否是一种安全有效的技术,如果不是,为什么这不安全和高效以及完成此任务的其他一些方法。

我认为作为每个 Web 服务请求的一部分,包含一个带有用户令牌的字符串参数。然后,此令牌用于确保发出请求的用户拥有该对象。

下面是一个没有安全性的当前函数的示例:

[System.Web.Http.HttpGet]
[Route("Getdata/{id:int}")]
[ResponseType(typeof(Data))]
public async Task<IHttpActionResult> GetData(int id)
{
    Data data = await dbSetService.Get(id);
    if (data == null)
    {
        return NotFound();
    }
    return Ok(data);
}

下面是具有基于令牌的安全性的函数示例:

[System.Web.Http.HttpGet]
[Route("Getdata/{string:token},{id:int}")]
[ResponseType(typeof(Data))]
public async Task<IHttpActionResult> GetData(string token, int id)
{
    Data data = await dbSetService.Get(id);
    if (data == null)
    {
        return NotFound();
    }
    //Check if the owner of the data object has the correct token, and the object is returned if the token is correct
    return Ok(data);
}

任何人都可以从任何应用程序访问 Web 服务。

Web 服务的基于令牌的安全性

令牌本身不是问题,但是将 GET 中的令牌作为查询字符串的一部分将使客户端和服务器之间的每个人都可以读取它。即使您使用 https。在 http 请求的标头中添加令牌更安全(例如,使用 Authorization 标头);头部也将使用 HTTPS 进行加密(与请求不同)。如果你不打算使用https,那么我猜这并不重要。

此外,我会添加一个过滤器类(并且 add 是控制器的属性),这样你就不需要在每个方法中进行检查。但是对于具有 3 个动作的简单控制器来说,这可能是矫枉过正。