2010-01-14 4 views
1

Я пытаюсь выполнить аутентификацию вызовов службы WCF DataServices через Silverlight. По сути, когда пользователь входит в систему, они получают специальный хеш, который должен быть встроен в заголовки каждого запроса в WCF DataServices. В настоящее время используют это в качестве проверки с помощью метода QueryInterceptor напримерАутентификация WCF DataServices

[QueryInterceptor("Orders")] 
    public Expression<Func<Orders,bool>> OnQueryOrders() 
    { 
     string hash = WebOperationContext.Current.IncomingRequest.Headers.Get("MyHeader"); 

     if(!TestHash(hash)) 
     { 
      return o => false; 
     } 
     else 
     { 
      return o => true; 
     } 
    } 

Это похоже на худший способ достижения этой цели. Есть ли какой-либо крючок в WCF Dataservices для запуска перед запуском запроса, который вы можете использовать для отмены запроса? Имейте в виду, что эта служба является апатридом и не имеет доступа к сеансу.

ответ

5

На самом деле, я думаю, что сам решил эту проблему. Переопределяя OnStartProcessingRequest, я могу выбросить исключение, если оно не подходит, например.

protected override void OnStartProcessingRequest(ProcessRequestArgs args) 
    { 
     if (string.IsNullOrEmpty(WebOperationContext.Current.IncomingRequest.Headers.Get("MyMagicHeader"))) 
     { 
      throw new DataServiceException(404, "Access denied!"); 
     } 
     else 
     { 
      base.OnStartProcessingRequest(args); 
     } 
    } 
+1

YOu должен вернуть 403 (Запрещено) вместо 404 (не найдено) –

+0

Удивительный! Почему мы не можем сделать это для аутентификации вместо глупого базового сценария cust. Это намного безопаснее? Я могу зашифровать сообщение или токен и проверить его на сервере. – gideon

0

Вы считали, что инспекторы сообщений WCF? Я думаю, что (не гарантировано) инспектор сообщений будет удален до перехватчика запросов, и вы сможете проверить заголовки и проверить значение хэширования пользователей. Вот хорошая ссылка с информацией о Writing Message Inspectors

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