Skip to content

Commit 2575432

Browse files
authored
Merge pull request #11126 from An0d/v9/9.0-rc003
Fix: AllowAnonymous attribute on Action is ignored when UmbracoMember…
2 parents f088a9b + e6413aa commit 2575432

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

src/Umbraco.Web.Common/Filters/UmbracoMemberAuthorizeFilter.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
using System.Collections.Generic;
22
using System.Globalization;
33
using System.Threading.Tasks;
4+
5+
using Microsoft.AspNetCore.Authorization;
6+
using Microsoft.AspNetCore.Http;
47
using Microsoft.AspNetCore.Mvc;
8+
using Microsoft.AspNetCore.Mvc.Authorization;
59
using Microsoft.AspNetCore.Mvc.Filters;
610
using Microsoft.Extensions.DependencyInjection;
711
using Umbraco.Cms.Core.Security;
@@ -43,6 +47,12 @@ public UmbracoMemberAuthorizeFilter(string allowType, string allowGroup, string
4347

4448
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
4549
{
50+
// Allow Anonymous skips all authorization
51+
if (HasAllowAnonymous(context))
52+
{
53+
return;
54+
}
55+
4656
IMemberManager memberManager = context.HttpContext.RequestServices.GetRequiredService<IMemberManager>();
4757

4858
if (!await IsAuthorizedAsync(memberManager))
@@ -52,6 +62,32 @@ public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
5262
}
5363
}
5464

65+
/// <summary>
66+
/// Copied from https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.Core/src/Authorization/AuthorizeFilter.cs
67+
/// </summary>
68+
private bool HasAllowAnonymous(AuthorizationFilterContext context)
69+
{
70+
var filters = context.Filters;
71+
for (var i = 0; i < filters.Count; i++)
72+
{
73+
if (filters[i] is IAllowAnonymousFilter)
74+
{
75+
return true;
76+
}
77+
}
78+
79+
// When doing endpoint routing, MVC does not add AllowAnonymousFilters for AllowAnonymousAttributes that
80+
// were discovered on controllers and actions. To maintain compat with 2.x,
81+
// we'll check for the presence of IAllowAnonymous in endpoint metadata.
82+
var endpoint = context.HttpContext.GetEndpoint();
83+
if (endpoint?.Metadata?.GetMetadata<IAllowAnonymous>() != null)
84+
{
85+
return true;
86+
}
87+
88+
return false;
89+
}
90+
5591
private async Task<bool> IsAuthorizedAsync(IMemberManager memberManager)
5692
{
5793
if (AllowMembers.IsNullOrWhiteSpace())

0 commit comments

Comments
 (0)