Что-то вроде рабочего фильтра в 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" } };
    }
Другие вопросы по тегам