像WCF REST中的操作过滤器?

时间:2011-10-03 14:02:23

标签: wcf forms-authentication wcf-rest wcf-behaviour

我正在寻找像MVC中AuthorizeAttribute这样的东西,我可以像这样使用:

    [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:我在Starter Kit中看到了RequestInterceptor示例,但我想要的只是将它放在某些方法中,并且该示例看起来像是在所有操作中执行的过滤器。

1 个答案:

答案 0 :(得分:1)

您可以使用AOP来实现此目的。我使用 PostSharp 作为AOP工具来实现此功能。您还可以找到sample on their website 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" } };
    }