73 lines
2.4 KiB
C#
73 lines
2.4 KiB
C#
using System;
|
|
using System.Web.Http;
|
|
using Umbraco.Core;
|
|
using Umbraco.Web.Composing;
|
|
using Umbraco.Web.Security;
|
|
|
|
namespace Umbraco.Web.WebApi
|
|
{
|
|
|
|
/// <summary>
|
|
/// Ensures authorization is successful for a back office user.
|
|
/// </summary>
|
|
public sealed class UmbracoAuthorizeAttribute : AuthorizeAttribute
|
|
{
|
|
private readonly bool _requireApproval;
|
|
|
|
/// <summary>
|
|
/// Can be used by unit tests to enable/disable this filter
|
|
/// </summary>
|
|
internal static bool Enable = true;
|
|
|
|
// TODO: inject!
|
|
private readonly UmbracoContext _umbracoContext;
|
|
private readonly IRuntimeState _runtimeState;
|
|
|
|
private IRuntimeState RuntimeState => _runtimeState ?? Current.RuntimeState;
|
|
|
|
private UmbracoContext UmbracoContext => _umbracoContext ?? Current.UmbracoContext;
|
|
|
|
/// <summary>
|
|
/// THIS SHOULD BE ONLY USED FOR UNIT TESTS
|
|
/// </summary>
|
|
/// <param name="umbracoContext"></param>
|
|
/// <param name="runtimeState"></param>
|
|
public UmbracoAuthorizeAttribute(UmbracoContext umbracoContext, IRuntimeState runtimeState)
|
|
{
|
|
if (umbracoContext == null) throw new ArgumentNullException(nameof(umbracoContext));
|
|
if (runtimeState == null) throw new ArgumentNullException(nameof(runtimeState));
|
|
_umbracoContext = umbracoContext;
|
|
_runtimeState = runtimeState;
|
|
}
|
|
|
|
public UmbracoAuthorizeAttribute() : this(true)
|
|
{ }
|
|
|
|
public UmbracoAuthorizeAttribute(bool requireApproval)
|
|
{
|
|
_requireApproval = requireApproval;
|
|
}
|
|
|
|
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
|
|
{
|
|
if (Enable == false)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
try
|
|
{
|
|
// if not configured (install or upgrade) then we can continue
|
|
// otherwise we need to ensure that a user is logged in
|
|
return RuntimeState.Level == RuntimeLevel.Install
|
|
|| RuntimeState.Level == RuntimeLevel.Upgrade
|
|
|| UmbracoContext.Security.ValidateCurrentUser(false, _requireApproval) == ValidateRequestAttempt.Success;
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|