2016-02-05 2 views
0

Я кодирую веб-службу C# с использованием веб-API 2, где некоторые из действий CRUD должны иметь некоторую защиту, основанную на подписке пользователя.Безопасность на основе токенов для веб-службы

Каждый пользователь имеет уникальный токен в качестве части своей подписки.

Прежде чем написать свой код для безопасности веб-службы, может кто-нибудь, пожалуйста, сообщите мне, если следующее является безопасным и эффективным методом, а если нет, то почему это небезопасно и эффективно, а также некоторые другие способы решения этой задачи.

Я думаю, что в качестве части каждого запроса веб-службы включен строковый параметр с токеном пользователя. Этот токен затем используется для обеспечения того, чтобы пользователь, выполняющий запрос, владел объектом.

Вот пример функции тока без защиты:

[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); 
} 

вебсервис может быть доступен любым , из любого приложения.

ответ

0

Сам токен не является проблемой, но наличие маркера в GET как части запроса приведет к его чтению для всех, кто находится между клиентом и сервером. Даже если вы используете https. Безопаснее добавлять токен в заголовок HTTP-запроса (например, используя заголовок Authorization); голова также будет зашифрована с помощью https (в отличие от запроса). Если вы не планируете использовать https, то, на мой взгляд, это не имеет большого значения.

Кроме того, я бы добавил класс фильтра (и добавит как свойство контроллера), так что вам не нужно делать проверку в каждом методе. Но для простого контроллера с тремя действиями он может быть излишним.

Смежные вопросы