2016-02-05 121 views
0

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

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

在我为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服务可以由任何人访问,来自任何应用程序。

回答

0

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

此外,我会添加一个过滤器类(并添加为控制器的属性),以便您不需要在每个方法中执行检查。但对于具有3个动作的简单控制器而言,这可能是过度杀伤的。