Что-то вроде рабочего фильтра в WCF REST?
Я ищу что-то вроде AuthorizeAttribute
в MVC я могу использовать что-то вроде этого:
[WebGet(UriTemplate = "data/{spageNumber}")]
[WebCache(CacheProfileName = "SampleProfile")]
[WcfAuthorize]
public IEnumerable<SampleItem> GetCollection(String spageNumber)
{
Int32 itemsPerPage = 10;
Int32 pageNumber = Int32.Parse(spageNumber);
return Enumerable.Range(pageNumber * itemsPerPage, itemsPerPage)
.Select(i => SampleItem.Create(i));
}
Тот WcfAuthorizeAttribute
, попытается аутентифицировать пользователя с помощью FormsAuthentication и установить IPrincipal контекста или вернуть HTTP 401 Unauthorized.
Я пытался с IOperationBehavior
, но я выполняюсь в первом методе, каким бы он ни был, а не в методе, который я установил для атрибута.
Как этого добиться в WCF REST?
С уважением.
PS: я видел пример RequestInterceptor в Starter Kit, но я хочу поместить его только в некоторые методы, и этот пример выглядит как фильтр, который вы выполняете во всех операциях.
1 ответ
Вы можете использовать АОП для достижения этой цели. Я использовал PostSharp в качестве инструмента АОП для достижения этой функциональности. Вы также можете найти образец на их сайте. OnMethodEntry выполняется до того, как будет выполнен метод (который украшен этим атрибутом), и вы можете выполнить свою проверку там.
Я сделал быстрый образец, чтобы проверить это, и это сработало.
[Serializable]
[ProvideAspectRole(StandardRoles.Security)]
public class WcfAuthorizeAttribute : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
//extract forms authentication token here from the request and perform validation.
}
}
И вы можете украсить ваши методы WCF, как показано ниже.
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1
{
[WcfAuthorize]
[WebGet(UriTemplate = "")]
public List<SampleItem> GetCollection()
{
return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } };
}