Похоже, техника, представленная в , это видео хорошо работает даже в службах данных WCF. Вы создаете пользовательский подкласс ServiceAuthorizationManager
(см. MSDN ), переопределяете CheckAccessCore()
и регистрируете его в web.config.
Я заставил его работать, передав ключ в заголовке HTTP запроса. OperationContext
, переданный CheckAccessCore
, не дает возможности получить заголовки HTTP-запроса , но вы можете получить их через HttpContext.Current.Request.Headers
. Затем вы можете получить правильный заголовок из этой коллекции и проверить его так, как вам нужно.
Вот необходимая регистрация в web.config:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceAuthorization serviceAuthorizationManagerType="FullyQualifiedTypeNameHere, ProjectNameHere" />
</behavior>
</serviceBehaviors>
</behaviors>
ОБНОВЛЕНИЕ: Я был не прав, имея возможность получить заголовки из HttpContext.Current.Request.Headers
; HttpContext.Current
равно нулю при работе в IIS (но, что интересно, не при отладке). Вместо этого используйте WebOperationContext.Current.IncomingRequest.Headers
согласно этому вопросу .
ОБНОВЛЕНИЕ 2: HttpContext.Current
является нулевым, только если вы не используете WCF в режиме совместимости с ASP.NET. Вы можете включить это, добавив следующую строку в web.config на уровне приложения в узле system.serviceModel
:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
Также добавьте это выше реализации вашей службы, если у вас есть ванильная служба WCF, работающая в дополнение к службе ADO.NET:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
Тогда вы можете получить HttpContext.Current.Request.Headers
и все остальные вещи, предоставляемые классом HttpRequest
.