C# web服务的基于令牌的安全性

C# web服务的基于令牌的安全性,c#,web-services,C#,Web Services,我正在使用WebAPI2编写一个C#web服务,其中一些CRUD操作需要基于用户订阅的安全性 每个用户都有一个唯一的字符串令牌作为其订阅的一部分 在我为webservice安全性编写代码之前,是否有人能告诉我以下技术是否安全高效,如果不是,为什么不安全高效,以及完成此任务的其他方法 我认为作为每个webservice请求的一部分,包含一个带有用户令牌的字符串参数。然后,该令牌用于确保发出请求的用户拥有该对象 以下是一个没有安全性的当前函数示例: [System.Web.Http.HttpGet]

我正在使用WebAPI2编写一个C#web服务,其中一些CRUD操作需要基于用户订阅的安全性

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

在我为webservice安全性编写代码之前,是否有人能告诉我以下技术是否安全高效,如果不是,为什么不安全高效,以及完成此任务的其他方法

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

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

[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);
}
[System.Web.Http.HttpGet]
[路由(“Getdata/{id:int}”)]
[响应类型(数据类型))]
公共异步任务GetData(int id)
{
Data=wait dbSetService.Get(id);
如果(数据==null)
{
返回NotFound();
}
返回Ok(数据);
}
以下是具有基于令牌的安全性的函数示例:

[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);
}
[System.Web.Http.HttpGet]
[路由(“Getdata/{string:token},{id:int}”)]
[响应类型(数据类型))]
公共异步任务GetData(字符串标记,int id)
{
Data=wait dbSetService.Get(id);
如果(数据==null)
{
返回NotFound();
}
//检查数据对象的所有者是否具有正确的令牌,如果令牌正确,则返回对象
返回Ok(数据);
}

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

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

此外,我将添加一个过滤器类(add是控制器的属性),这样您就不需要在每个方法中进行检查。但对于一个有3个动作的简单控制器来说,这可能是杀伤力过大