Adding IAuthorizationFilter support for WebApi

This commit is contained in:
Nicholas Mayne
2014-06-22 22:55:19 +01:00
parent aed9793fc0
commit 64e1a745f5
3 changed files with 25 additions and 0 deletions

View File

@@ -158,6 +158,7 @@ namespace Orchard.Environment {
GlobalConfiguration.Configuration.Filters.Add(new OrchardApiActionFilterDispatcher());
GlobalConfiguration.Configuration.Filters.Add(new OrchardApiExceptionFilterDispatcher());
GlobalConfiguration.Configuration.Filters.Add(new OrchardApiAuthorizationFilterDispatcher());
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new ThemeAwareViewEngineShim());

View File

@@ -604,6 +604,7 @@
<Compile Include="WebApi\DefaultOrchardWebApiHttpControllerSelector.cs" />
<Compile Include="WebApi\DefaultOrchardWebApiHttpHttpControllerActivator.cs" />
<Compile Include="WebApi\Extensions\RouteExtension.cs" />
<Compile Include="WebApi\Filters\OrchardApiAuthorizationFilterDispatcher.cs" />
<Compile Include="WebApi\Filters\UnhandledApiExceptionFilter.cs" />
<Compile Include="WebApi\Filters\IFilterProvider.cs" />
<Compile Include="WebApi\Filters\OrchardApiExceptionFilterDispatcher.cs" />

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace Orchard.WebApi.Filters {
public class OrchardApiAuthorizationFilterDispatcher : IAuthorizationFilter {
public bool AllowMultiple { get; private set; }
public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) {
var workContext = actionContext.ControllerContext.GetWorkContext();
foreach (var actionFilter in workContext.Resolve<IEnumerable<IApiFilterProvider>>().OfType<IAuthorizationFilter>()) {
continuation = () => actionFilter.ExecuteAuthorizationFilterAsync(actionContext, cancellationToken, continuation);
}
return await continuation();
}
}
}