2

我正在寻找类似AuthorizeAttributeMVC 中的东西,我可以这样使用:

    [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。

我尝试过使用 a IOperationBehavior,但我在第一种方法中执行,无论是哪种方法,而不是在我设置属性的方法中。

如何在 WCF REST 中实现这一点?

问候。

PS:我在 Starter Kit 中看到过 RequestInterceptor 示例,但我想要的只是将它放在某些方法中,并且该示例看起来像您在所有操作中执行的过滤器。

4

1 回答 1

1

您可以使用AOP来实现这一点。我使用PostSharp作为 AOP 工具来实现此功能。您也可以在他们的网站上找到样本。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" } };
    }
于 2012-04-06T18:07:51.850 回答