Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit 4c2d727

Browse files
committed
React to Auth + switch to Policy Evaluator
1 parent bb5eb96 commit 4c2d727

File tree

6 files changed

+52
-193
lines changed

6 files changed

+52
-193
lines changed

src/Microsoft.AspNetCore.Mvc.Core/Authorization/AuthorizeFilter.cs

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Threading.Tasks;
1010
using Microsoft.AspNetCore.Authentication;
1111
using Microsoft.AspNetCore.Authorization;
12+
using Microsoft.AspNetCore.Authorization.Policy;
1213
using Microsoft.AspNetCore.Mvc.Core;
1314
using Microsoft.AspNetCore.Mvc.Filters;
1415
using Microsoft.AspNetCore.Mvc.Internal;
@@ -125,41 +126,26 @@ public virtual async Task OnAuthorizationAsync(AuthorizationFilterContext contex
125126
return;
126127
}
127128

128-
// Build a ClaimsPrincipal with the Policy's required authentication types
129-
if (effectivePolicy.AuthenticationSchemes != null && effectivePolicy.AuthenticationSchemes.Count > 0)
130-
{
131-
ClaimsPrincipal newPrincipal = null;
132-
for (var i = 0; i < effectivePolicy.AuthenticationSchemes.Count; i++)
133-
{
134-
var scheme = effectivePolicy.AuthenticationSchemes[i];
135-
var result = await context.HttpContext.AuthenticateAsync(scheme);
136-
if (result.Succeeded)
137-
{
138-
newPrincipal = SecurityHelper.MergeUserPrincipal(newPrincipal, result.Principal);
139-
}
140-
}
141-
// If all schemes failed authentication, provide a default identity anyways
142-
if (newPrincipal == null)
143-
{
144-
newPrincipal = new ClaimsPrincipal(new ClaimsIdentity());
145-
}
146-
context.HttpContext.User = newPrincipal;
147-
}
129+
var policyEvaluator = context.HttpContext.RequestServices.GetRequiredService<IPolicyEvaluator>();
130+
131+
var authenticateResult = await policyEvaluator.AuthenticateAsync(effectivePolicy, context.HttpContext);
148132

149133
// Allow Anonymous skips all authorization
150134
if (context.Filters.Any(item => item is IAllowAnonymousFilter))
151135
{
152136
return;
153137
}
154138

155-
var httpContext = context.HttpContext;
156-
var authService = httpContext.RequestServices.GetRequiredService<IAuthorizationService>();
139+
var authorizeResult = await policyEvaluator.AuthorizeAsync(effectivePolicy, authenticateResult, context.HttpContext);
157140

158-
// Note: Default Anonymous User is new ClaimsPrincipal(new ClaimsIdentity())
159-
if (!await authService.AuthorizeAsync(httpContext.User, context, effectivePolicy))
141+
if (authorizeResult.Challenged)
160142
{
161143
context.Result = new ChallengeResult(effectivePolicy.AuthenticationSchemes.ToArray());
162144
}
145+
else if (authorizeResult.Forbidden)
146+
{
147+
context.Result = new ForbidResult(effectivePolicy.AuthenticationSchemes.ToArray());
148+
}
163149
}
164150

165151
IFilterMetadata IFilterFactory.CreateInstance(IServiceProvider serviceProvider)

src/Microsoft.AspNetCore.Mvc.Core/DependencyInjection/MvcCoreMvcCoreBuilderExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ internal static void AddAuthorizationServices(IServiceCollection services)
9292
{
9393
services.AddAuthenticationCore();
9494
services.AddAuthorization();
95+
services.AddAuthorizationPolicyEvaluator();
9596

9697
services.TryAddEnumerable(
9798
ServiceDescriptor.Transient<IApplicationModelProvider, AuthorizationApplicationModelProvider>());

src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Microsoft.AspNetCore.Mvc.RouteAttribute</Description>
2222
<ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Abstractions\Microsoft.AspNetCore.Mvc.Abstractions.csproj" />
2323

2424
<PackageReference Include="Microsoft.AspNetCore.Authentication.Core" Version="$(AspNetCoreVersion)" />
25-
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="$(AspNetCoreVersion)" />
25+
<PackageReference Include="Microsoft.AspNetCore.Authorization.Policy" Version="$(AspNetCoreVersion)" />
2626
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="$(AspNetCoreVersion)" />
2727
<PackageReference Include="Microsoft.AspNetCore.Http" Version="$(AspNetCoreVersion)" />
2828
<PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="$(AspNetCoreVersion)" />

0 commit comments

Comments
 (0)