Что-то вроде фильтра операций в WCF REST? - PullRequest
2 голосов
/ 03 октября 2011

Я ищу что-то вроде 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 Ответ

1 голос
/ 06 апреля 2012

Вы можете использовать AOP для достижения этой цели.Я использовал 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" } };
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...