2015-02-04 8 views
2

После того, как я ударил головой в течение дня, я прошу помощи. У меня есть приложение Web Forms с хостингом WCF на одном компьютере. У службы WCF есть методы с некоторыми пользовательскими разрешениями (например, только «admin» может устанавливать пароли для пользователей).Пропустить заголовки сообщений на WCF через netTcpBinding

Приложение веб-форм использует аутентификацию форм, поэтому у меня есть HttpContext.Current.User со всеми ролями, которые это использует. Таким образом, я использовал AuthCookie передать объект через HttpRequestMessageProperty и читать его так:

HttpRequestMessageProperty property = 
OperationContext.Current.IncomingMessageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;  

С basicHttpBinding, что работал отлично. Но тогда мне нужно было реализовать протокол net.tcp, так что HttpRequestMessageProperty больше не работает. Я попытался добавить его на MessageHeader, но это тоже не сработает.

OperationContext.Current.IncomingMessageProperties не получил ни один из моих заголовков ...

Так как я могу передать список ролей пользователей к моему WCF? Я использую безопасность Windows, как это, но мне нужно передать роли из HttpContext.Current.User:

<netTcpBinding> 
    <binding transactionFlow="True"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </netTcpBinding> 

ответ

1

КИ, так что я нашел рабочий способ для передачи информации роли. Несмотря на то, что это до сих пор неясно, почему стандартные способы не работают для меня здесь является правильным (благодаря Guy Burstein):

Клиент:

   MessageHeader<string> header = new MessageHeader<string>(roleData); 
       MessageHeader untypedHeader = header.GetUntypedHeader(ProjectParam.Role, "justASampleNamespace"); 
       OperationContext.Current.OutgoingMessageHeaders.Add(untypedHeader); 

WCF:

string roles = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(ProjectParam.Role, "justASampleNamespace"); 
if(roles.Contains(ProjectParam.AdminLoginID)) 
{ 
//Now business logic comes 
} 

ProjectParam.Role просто внутренняя константа, используемая для ключа, а второй параметр - примерная строка (MSDN говорит «пространство имен»)

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

  • Нет связанных вопросов^_^