From 64e1a745f56eb0103b1c4c39fe28c9baaee05df1 Mon Sep 17 00:00:00 2001 From: Nicholas Mayne Date: Sun, 22 Jun 2014 22:55:19 +0100 Subject: [PATCH] Adding IAuthorizationFilter support for WebApi --- src/Orchard/Environment/OrchardStarter.cs | 1 + src/Orchard/Orchard.Framework.csproj | 1 + ...OrchardApiAuthorizationFilterDispatcher.cs | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 src/Orchard/WebApi/Filters/OrchardApiAuthorizationFilterDispatcher.cs diff --git a/src/Orchard/Environment/OrchardStarter.cs b/src/Orchard/Environment/OrchardStarter.cs index ace59cc0f..938605dbe 100644 --- a/src/Orchard/Environment/OrchardStarter.cs +++ b/src/Orchard/Environment/OrchardStarter.cs @@ -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()); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 715b3517f..2adfa28a5 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -604,6 +604,7 @@ + diff --git a/src/Orchard/WebApi/Filters/OrchardApiAuthorizationFilterDispatcher.cs b/src/Orchard/WebApi/Filters/OrchardApiAuthorizationFilterDispatcher.cs new file mode 100644 index 000000000..1e3970218 --- /dev/null +++ b/src/Orchard/WebApi/Filters/OrchardApiAuthorizationFilterDispatcher.cs @@ -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 ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func> continuation) { + var workContext = actionContext.ControllerContext.GetWorkContext(); + + foreach (var actionFilter in workContext.Resolve>().OfType()) { + continuation = () => actionFilter.ExecuteAuthorizationFilterAsync(actionContext, cancellationToken, continuation); + } + + return await continuation(); + } + } +} \ No newline at end of file