我正在寻找像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示例,但我想要的只是将它放在某些方法中,并且该示例看起来像是在所有操作中执行的过滤器。
答案 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" } };
}