diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props index e0f67e29745d..fbd9a9df533a 100644 --- a/eng/ProjectReferences.props +++ b/eng/ProjectReferences.props @@ -65,6 +65,8 @@ + + diff --git a/eng/SharedFramework.Local.props b/eng/SharedFramework.Local.props index 089cea8bb5ca..4c3258f85682 100644 --- a/eng/SharedFramework.Local.props +++ b/eng/SharedFramework.Local.props @@ -10,6 +10,8 @@ + + diff --git a/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj index d5b065b3d855..0b8e084da4d7 100644 --- a/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -20,6 +20,7 @@ Microsoft.AspNetCore.Http.HttpResponse + diff --git a/src/Http/Http.Abstractions/src/IAllowAnonymous.cs b/src/Security/Authorization/Common.Abstractions/src/IAllowAnonymous.cs similarity index 100% rename from src/Http/Http.Abstractions/src/IAllowAnonymous.cs rename to src/Security/Authorization/Common.Abstractions/src/IAllowAnonymous.cs diff --git a/src/Http/Http.Abstractions/src/IAuthorizeData.cs b/src/Security/Authorization/Common.Abstractions/src/IAuthorizeData.cs similarity index 100% rename from src/Http/Http.Abstractions/src/IAuthorizeData.cs rename to src/Security/Authorization/Common.Abstractions/src/IAuthorizeData.cs diff --git a/src/Security/Authorization/Common.Abstractions/src/Microsoft.AspNetCore.Authorization.Common.Abstractions.csproj b/src/Security/Authorization/Common.Abstractions/src/Microsoft.AspNetCore.Authorization.Common.Abstractions.csproj new file mode 100644 index 000000000000..5d458f30edf2 --- /dev/null +++ b/src/Security/Authorization/Common.Abstractions/src/Microsoft.AspNetCore.Authorization.Common.Abstractions.csproj @@ -0,0 +1,9 @@ + + + + netstandard2.0 + true + true + + + diff --git a/src/Security/Authorization/Core/src/AllowAnonymousAttribute.cs b/src/Security/Authorization/Common/src/AllowAnonymousAttribute.cs similarity index 100% rename from src/Security/Authorization/Core/src/AllowAnonymousAttribute.cs rename to src/Security/Authorization/Common/src/AllowAnonymousAttribute.cs diff --git a/src/Security/Authorization/Core/src/AssertionRequirement.cs b/src/Security/Authorization/Common/src/AssertionRequirement.cs similarity index 100% rename from src/Security/Authorization/Core/src/AssertionRequirement.cs rename to src/Security/Authorization/Common/src/AssertionRequirement.cs diff --git a/src/Security/Authorization/Core/src/AuthorizationFailure.cs b/src/Security/Authorization/Common/src/AuthorizationFailure.cs similarity index 100% rename from src/Security/Authorization/Core/src/AuthorizationFailure.cs rename to src/Security/Authorization/Common/src/AuthorizationFailure.cs diff --git a/src/Security/Authorization/Core/src/AuthorizationHandler.cs b/src/Security/Authorization/Common/src/AuthorizationHandler.cs similarity index 100% rename from src/Security/Authorization/Core/src/AuthorizationHandler.cs rename to src/Security/Authorization/Common/src/AuthorizationHandler.cs diff --git a/src/Security/Authorization/Core/src/AuthorizationHandlerContext.cs b/src/Security/Authorization/Common/src/AuthorizationHandlerContext.cs similarity index 99% rename from src/Security/Authorization/Core/src/AuthorizationHandlerContext.cs rename to src/Security/Authorization/Common/src/AuthorizationHandlerContext.cs index b6378e4073aa..d0abba917efc 100644 --- a/src/Security/Authorization/Core/src/AuthorizationHandlerContext.cs +++ b/src/Security/Authorization/Common/src/AuthorizationHandlerContext.cs @@ -95,4 +95,4 @@ public virtual void Succeed(IAuthorizationRequirement requirement) _pendingRequirements.Remove(requirement); } } -} \ No newline at end of file +} diff --git a/src/Security/Authorization/Core/src/AuthorizationOptions.cs b/src/Security/Authorization/Common/src/AuthorizationOptions.cs similarity index 100% rename from src/Security/Authorization/Core/src/AuthorizationOptions.cs rename to src/Security/Authorization/Common/src/AuthorizationOptions.cs diff --git a/src/Security/Authorization/Core/src/AuthorizationPolicy.cs b/src/Security/Authorization/Common/src/AuthorizationPolicy.cs similarity index 97% rename from src/Security/Authorization/Core/src/AuthorizationPolicy.cs rename to src/Security/Authorization/Common/src/AuthorizationPolicy.cs index d68087791e59..04b25c3f175f 100644 --- a/src/Security/Authorization/Core/src/AuthorizationPolicy.cs +++ b/src/Security/Authorization/Common/src/AuthorizationPolicy.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization.Common; namespace Microsoft.AspNetCore.Authorization { @@ -143,7 +144,8 @@ public static async Task CombineAsync(IAuthorizationPolicyP var policy = await policyProvider.GetPolicyAsync(authorizeDatum.Policy); if (policy == null) { - throw new InvalidOperationException(Resources.FormatException_AuthorizationPolicyNotFound(authorizeDatum.Policy)); + throw new InvalidOperationException( + string.Format(Resources.Exception_AuthorizationPolicyNotFound, authorizeDatum.Policy)); } policyBuilder.Combine(policy); useDefaultPolicy = false; @@ -179,4 +181,4 @@ public static async Task CombineAsync(IAuthorizationPolicyP return policyBuilder?.Build(); } } -} \ No newline at end of file +} diff --git a/src/Security/Authorization/Core/src/AuthorizationPolicyBuilder.cs b/src/Security/Authorization/Common/src/AuthorizationPolicyBuilder.cs similarity index 100% rename from src/Security/Authorization/Core/src/AuthorizationPolicyBuilder.cs rename to src/Security/Authorization/Common/src/AuthorizationPolicyBuilder.cs diff --git a/src/Security/Authorization/Core/src/AuthorizationResult.cs b/src/Security/Authorization/Common/src/AuthorizationResult.cs similarity index 100% rename from src/Security/Authorization/Core/src/AuthorizationResult.cs rename to src/Security/Authorization/Common/src/AuthorizationResult.cs diff --git a/src/Security/Authorization/Common/src/AuthorizationServiceCollectionCommonExtensions.cs b/src/Security/Authorization/Common/src/AuthorizationServiceCollectionCommonExtensions.cs new file mode 100644 index 000000000000..053095608c21 --- /dev/null +++ b/src/Security/Authorization/Common/src/AuthorizationServiceCollectionCommonExtensions.cs @@ -0,0 +1,64 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization.Infrastructure; +using Microsoft.AspNetCore.Authorization.Policy; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// Extension methods for setting up authorization services in an . + /// + public static class AuthorizationServiceCollectionCommonExtensions + { + /// + /// Adds authorization services to the specified . + /// + /// The to add services to. + /// The so that additional calls can be chained. + public static IServiceCollection AddAuthorizationCommon(this IServiceCollection services) + { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAddEnumerable(ServiceDescriptor.Transient()); + + // Policy + services.TryAdd(ServiceDescriptor.Transient()); + + return services; + } + + /// + /// Adds authorization services to the specified . + /// + /// The to add services to. + /// An action delegate to configure the provided . + /// The so that additional calls can be chained. + public static IServiceCollection AddAuthorizationCommon(this IServiceCollection services, Action configure) + { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + + if (configure == null) + { + throw new ArgumentNullException(nameof(configure)); + } + + services.Configure(configure); + return services.AddAuthorizationCommon(); + } + } +} diff --git a/src/Security/Authorization/Core/src/AuthorizationServiceExtensions.cs b/src/Security/Authorization/Common/src/AuthorizationServiceExtensions.cs similarity index 100% rename from src/Security/Authorization/Core/src/AuthorizationServiceExtensions.cs rename to src/Security/Authorization/Common/src/AuthorizationServiceExtensions.cs diff --git a/src/Security/Authorization/Core/src/AuthorizeAttribute.cs b/src/Security/Authorization/Common/src/AuthorizeAttribute.cs similarity index 100% rename from src/Security/Authorization/Core/src/AuthorizeAttribute.cs rename to src/Security/Authorization/Common/src/AuthorizeAttribute.cs diff --git a/src/Security/Authorization/Core/src/ClaimsAuthorizationRequirement.cs b/src/Security/Authorization/Common/src/ClaimsAuthorizationRequirement.cs similarity index 100% rename from src/Security/Authorization/Core/src/ClaimsAuthorizationRequirement.cs rename to src/Security/Authorization/Common/src/ClaimsAuthorizationRequirement.cs diff --git a/src/Security/Authorization/Core/src/DefaultAuthorizationEvaluator.cs b/src/Security/Authorization/Common/src/DefaultAuthorizationEvaluator.cs similarity index 100% rename from src/Security/Authorization/Core/src/DefaultAuthorizationEvaluator.cs rename to src/Security/Authorization/Common/src/DefaultAuthorizationEvaluator.cs diff --git a/src/Security/Authorization/Core/src/DefaultAuthorizationHandlerContextFactory.cs b/src/Security/Authorization/Common/src/DefaultAuthorizationHandlerContextFactory.cs similarity index 100% rename from src/Security/Authorization/Core/src/DefaultAuthorizationHandlerContextFactory.cs rename to src/Security/Authorization/Common/src/DefaultAuthorizationHandlerContextFactory.cs diff --git a/src/Security/Authorization/Core/src/DefaultAuthorizationHandlerProvider.cs b/src/Security/Authorization/Common/src/DefaultAuthorizationHandlerProvider.cs similarity index 100% rename from src/Security/Authorization/Core/src/DefaultAuthorizationHandlerProvider.cs rename to src/Security/Authorization/Common/src/DefaultAuthorizationHandlerProvider.cs diff --git a/src/Security/Authorization/Core/src/DefaultAuthorizationPolicyProvider.cs b/src/Security/Authorization/Common/src/DefaultAuthorizationPolicyProvider.cs similarity index 100% rename from src/Security/Authorization/Core/src/DefaultAuthorizationPolicyProvider.cs rename to src/Security/Authorization/Common/src/DefaultAuthorizationPolicyProvider.cs diff --git a/src/Security/Authorization/Core/src/DefaultAuthorizationService.cs b/src/Security/Authorization/Common/src/DefaultAuthorizationService.cs similarity index 99% rename from src/Security/Authorization/Core/src/DefaultAuthorizationService.cs rename to src/Security/Authorization/Common/src/DefaultAuthorizationService.cs index bc5d571c47bc..60efc4a7510d 100644 --- a/src/Security/Authorization/Core/src/DefaultAuthorizationService.cs +++ b/src/Security/Authorization/Common/src/DefaultAuthorizationService.cs @@ -132,4 +132,4 @@ public async Task AuthorizeAsync(ClaimsPrincipal user, obje return await this.AuthorizeAsync(user, resource, policy); } } -} \ No newline at end of file +} diff --git a/src/Security/Authorization/Core/src/DenyAnonymousAuthorizationRequirement.cs b/src/Security/Authorization/Common/src/DenyAnonymousAuthorizationRequirement.cs similarity index 100% rename from src/Security/Authorization/Core/src/DenyAnonymousAuthorizationRequirement.cs rename to src/Security/Authorization/Common/src/DenyAnonymousAuthorizationRequirement.cs diff --git a/src/Security/Authorization/Core/src/IAuthorizationEvaluator.cs b/src/Security/Authorization/Common/src/IAuthorizationEvaluator.cs similarity index 100% rename from src/Security/Authorization/Core/src/IAuthorizationEvaluator.cs rename to src/Security/Authorization/Common/src/IAuthorizationEvaluator.cs diff --git a/src/Security/Authorization/Core/src/IAuthorizationHandler.cs b/src/Security/Authorization/Common/src/IAuthorizationHandler.cs similarity index 100% rename from src/Security/Authorization/Core/src/IAuthorizationHandler.cs rename to src/Security/Authorization/Common/src/IAuthorizationHandler.cs diff --git a/src/Security/Authorization/Core/src/IAuthorizationHandlerContextFactory.cs b/src/Security/Authorization/Common/src/IAuthorizationHandlerContextFactory.cs similarity index 100% rename from src/Security/Authorization/Core/src/IAuthorizationHandlerContextFactory.cs rename to src/Security/Authorization/Common/src/IAuthorizationHandlerContextFactory.cs diff --git a/src/Security/Authorization/Core/src/IAuthorizationHandlerProvider.cs b/src/Security/Authorization/Common/src/IAuthorizationHandlerProvider.cs similarity index 100% rename from src/Security/Authorization/Core/src/IAuthorizationHandlerProvider.cs rename to src/Security/Authorization/Common/src/IAuthorizationHandlerProvider.cs diff --git a/src/Security/Authorization/Core/src/IAuthorizationPolicyProvider.cs b/src/Security/Authorization/Common/src/IAuthorizationPolicyProvider.cs similarity index 100% rename from src/Security/Authorization/Core/src/IAuthorizationPolicyProvider.cs rename to src/Security/Authorization/Common/src/IAuthorizationPolicyProvider.cs diff --git a/src/Security/Authorization/Core/src/IAuthorizationRequirement.cs b/src/Security/Authorization/Common/src/IAuthorizationRequirement.cs similarity index 100% rename from src/Security/Authorization/Core/src/IAuthorizationRequirement.cs rename to src/Security/Authorization/Common/src/IAuthorizationRequirement.cs diff --git a/src/Security/Authorization/Core/src/IAuthorizationService.cs b/src/Security/Authorization/Common/src/IAuthorizationService.cs similarity index 100% rename from src/Security/Authorization/Core/src/IAuthorizationService.cs rename to src/Security/Authorization/Common/src/IAuthorizationService.cs diff --git a/src/Security/Authorization/Core/src/LoggingExtensions.cs b/src/Security/Authorization/Common/src/LoggingExtensions.cs similarity index 100% rename from src/Security/Authorization/Core/src/LoggingExtensions.cs rename to src/Security/Authorization/Common/src/LoggingExtensions.cs diff --git a/src/Security/Authorization/Common/src/Microsoft.AspNetCore.Authorization.Common.csproj b/src/Security/Authorization/Common/src/Microsoft.AspNetCore.Authorization.Common.csproj new file mode 100644 index 000000000000..358f92eb8661 --- /dev/null +++ b/src/Security/Authorization/Common/src/Microsoft.AspNetCore.Authorization.Common.csproj @@ -0,0 +1,28 @@ + + + + netstandard2.0 + true + true + + + + + + + + + + + True + True + Resources.resx + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + diff --git a/src/Security/Authorization/Core/src/NameAuthorizationRequirement.cs b/src/Security/Authorization/Common/src/NameAuthorizationRequirement.cs similarity index 100% rename from src/Security/Authorization/Core/src/NameAuthorizationRequirement.cs rename to src/Security/Authorization/Common/src/NameAuthorizationRequirement.cs diff --git a/src/Security/Authorization/Core/src/OperationAuthorizationRequirement.cs b/src/Security/Authorization/Common/src/OperationAuthorizationRequirement.cs similarity index 100% rename from src/Security/Authorization/Core/src/OperationAuthorizationRequirement.cs rename to src/Security/Authorization/Common/src/OperationAuthorizationRequirement.cs diff --git a/src/Security/Authorization/Core/src/PassThroughAuthorizationHandler.cs b/src/Security/Authorization/Common/src/PassThroughAuthorizationHandler.cs similarity index 100% rename from src/Security/Authorization/Core/src/PassThroughAuthorizationHandler.cs rename to src/Security/Authorization/Common/src/PassThroughAuthorizationHandler.cs diff --git a/src/Security/Authorization/Common/src/Policy/CommonPolicyEvaluator.cs b/src/Security/Authorization/Common/src/Policy/CommonPolicyEvaluator.cs new file mode 100644 index 000000000000..34531b82b85e --- /dev/null +++ b/src/Security/Authorization/Common/src/Policy/CommonPolicyEvaluator.cs @@ -0,0 +1,60 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Authorization.Policy +{ + public class CommonPolicyEvaluator : ICommonPolicyEvaluator + { + private readonly IAuthorizationService _authorization; + + /// + /// Constructor + /// + /// The authorization service. + public CommonPolicyEvaluator(IAuthorizationService authorization) + { + _authorization = authorization; + } + + /// + /// Attempts authorization for a policy using . + /// + /// The . + /// True if authentication succeeded, otherwise false. + /// The . + /// + /// An optional resource the policy should be checked with. + /// If a resource is not required for policy evaluation you may pass null as the value. + /// + /// Returns if authorization succeeds. + /// Otherwise returns if , otherwise + /// returns + public virtual async Task AuthorizeAsync(AuthorizationPolicy policy, bool authenticationSucceeded, ClaimsPrincipal user, object resource) + { + if (policy == null) + { + throw new ArgumentNullException(nameof(policy)); + } + + if (user == null) + { + throw new ArgumentNullException(nameof(user)); + } + + var result = await _authorization.AuthorizeAsync(user, resource, policy); + if (result.Succeeded) + { + return PolicyAuthorizationResult.Success(); + } + + // If authentication was successful, return forbidden, otherwise challenge + return authenticationSucceeded + ? PolicyAuthorizationResult.Forbid() + : PolicyAuthorizationResult.Challenge(); + } + } +} diff --git a/src/Security/Authorization/Common/src/Policy/ICommonPolicyEvaluator.cs b/src/Security/Authorization/Common/src/Policy/ICommonPolicyEvaluator.cs new file mode 100644 index 000000000000..a68b268ba04c --- /dev/null +++ b/src/Security/Authorization/Common/src/Policy/ICommonPolicyEvaluator.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Authorization.Policy +{ + public interface ICommonPolicyEvaluator + { + /// + /// Attempts authorization for a policy using . + /// + /// The . + /// True if authentication succeeded, otherwise false. + /// The . + /// + /// An optional resource the policy should be checked with. + /// If a resource is not required for policy evaluation you may pass null as the value. + /// + /// Returns if authorization succeeds. + /// Otherwise returns if , otherwise + /// returns + Task AuthorizeAsync(AuthorizationPolicy policy, bool authenticationSucceeded, ClaimsPrincipal user, object resource); + } +} diff --git a/src/Security/Authorization/Core/src/Policy/PolicyAuthorizationResult.cs b/src/Security/Authorization/Common/src/Policy/PolicyAuthorizationResult.cs similarity index 99% rename from src/Security/Authorization/Core/src/Policy/PolicyAuthorizationResult.cs rename to src/Security/Authorization/Common/src/Policy/PolicyAuthorizationResult.cs index d7d481dcd6ee..3150311d0eda 100644 --- a/src/Security/Authorization/Core/src/Policy/PolicyAuthorizationResult.cs +++ b/src/Security/Authorization/Common/src/Policy/PolicyAuthorizationResult.cs @@ -32,4 +32,4 @@ public static PolicyAuthorizationResult Success() => new PolicyAuthorizationResult { Succeeded = true }; } -} \ No newline at end of file +} diff --git a/src/Security/Authorization/Common/src/Resources.Designer.cs b/src/Security/Authorization/Common/src/Resources.Designer.cs new file mode 100644 index 000000000000..3f4f42cffe02 --- /dev/null +++ b/src/Security/Authorization/Common/src/Resources.Designer.cs @@ -0,0 +1,99 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.AspNetCore.Authorization.Common { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.AspNetCore.Authorization.Common.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to AuthorizationPolicy must have at least one requirement.. + /// + internal static string Exception_AuthorizationPolicyEmpty { + get { + return ResourceManager.GetString("Exception_AuthorizationPolicyEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The AuthorizationPolicy named: '{0}' was not found.. + /// + internal static string Exception_AuthorizationPolicyNotFound { + get { + return ResourceManager.GetString("Exception_AuthorizationPolicyNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At least one role must be specified.. + /// + internal static string Exception_RoleRequirementEmpty { + get { + return ResourceManager.GetString("Exception_RoleRequirementEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find the required services. Please add all the required services by calling '{0}.{1}' inside the call to '{2}' in the application startup code.. + /// + internal static string Exception_UnableToFindServices { + get { + return ResourceManager.GetString("Exception_UnableToFindServices", resourceCulture); + } + } + } +} diff --git a/src/Security/Authorization/Common/src/Resources.resx b/src/Security/Authorization/Common/src/Resources.resx new file mode 100644 index 000000000000..ebf1328616db --- /dev/null +++ b/src/Security/Authorization/Common/src/Resources.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AuthorizationPolicy must have at least one requirement. + + + The AuthorizationPolicy named: '{0}' was not found. + + + At least one role must be specified. + + + Unable to find the required services. Please add all the required services by calling '{0}.{1}' inside the call to '{2}' in the application startup code. + + \ No newline at end of file diff --git a/src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs b/src/Security/Authorization/Common/src/RolesAuthorizationRequirement.cs similarity index 98% rename from src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs rename to src/Security/Authorization/Common/src/RolesAuthorizationRequirement.cs index 811e17aacda5..4b019540d824 100644 --- a/src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs +++ b/src/Security/Authorization/Common/src/RolesAuthorizationRequirement.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization.Common; namespace Microsoft.AspNetCore.Authorization.Infrastructure { diff --git a/src/Security/Authorization/Core/src/AuthorizationMarkerService.cs b/src/Security/Authorization/Core/src/AuthorizationMarkerService.cs index 122d237e8cf9..c954c939bbb7 100644 --- a/src/Security/Authorization/Core/src/AuthorizationMarkerService.cs +++ b/src/Security/Authorization/Core/src/AuthorizationMarkerService.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNetCore.Authorization.Policy +namespace Microsoft.AspNetCore.Authorization { internal class AuthorizationMarkerService { diff --git a/src/Security/Authorization/Core/src/AuthorizationServiceCollectionExtensions.cs b/src/Security/Authorization/Core/src/AuthorizationServiceCollectionExtensions.cs index c3b0dc580bc1..7b726428ff67 100644 --- a/src/Security/Authorization/Core/src/AuthorizationServiceCollectionExtensions.cs +++ b/src/Security/Authorization/Core/src/AuthorizationServiceCollectionExtensions.cs @@ -3,7 +3,6 @@ using System; using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Authorization.Infrastructure; using Microsoft.AspNetCore.Authorization.Policy; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -25,13 +24,8 @@ public static IServiceCollection AddAuthorization(this IServiceCollection servic { throw new ArgumentNullException(nameof(services)); } - - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAddEnumerable(ServiceDescriptor.Transient()); + + services.AddAuthorizationCommon(); services.TryAddSingleton(); // Policy diff --git a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj index 726247c53b63..59ae79658a72 100644 --- a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj +++ b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj @@ -18,6 +18,7 @@ Microsoft.AspNetCore.Authorization.AuthorizeAttribute + diff --git a/src/Security/Authorization/Core/src/Policy/AuthorizationAppBuilderExtensions.cs b/src/Security/Authorization/Core/src/Policy/AuthorizationAppBuilderExtensions.cs index a34551243bfa..0b52997046f4 100644 --- a/src/Security/Authorization/Core/src/Policy/AuthorizationAppBuilderExtensions.cs +++ b/src/Security/Authorization/Core/src/Policy/AuthorizationAppBuilderExtensions.cs @@ -3,7 +3,6 @@ using System; using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Authorization.Policy; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Builder diff --git a/src/Security/Authorization/Core/src/Policy/PolicyEvaluator.cs b/src/Security/Authorization/Core/src/Policy/PolicyEvaluator.cs index 3100ff4d3ebd..1bc9077da960 100644 --- a/src/Security/Authorization/Core/src/Policy/PolicyEvaluator.cs +++ b/src/Security/Authorization/Core/src/Policy/PolicyEvaluator.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; @@ -12,15 +11,15 @@ namespace Microsoft.AspNetCore.Authorization.Policy { public class PolicyEvaluator : IPolicyEvaluator { - private readonly IAuthorizationService _authorization; + private readonly ICommonPolicyEvaluator _commonPolicyEvaluator; /// /// Constructor /// - /// The authorization service. - public PolicyEvaluator(IAuthorizationService authorization) + /// The . + public PolicyEvaluator(ICommonPolicyEvaluator commonPolicyEvaluator) { - _authorization = authorization; + _commonPolicyEvaluator = commonPolicyEvaluator; } /// @@ -74,23 +73,9 @@ public virtual async Task AuthenticateAsync(AuthorizationPol /// Returns if authorization succeeds. /// Otherwise returns if , otherwise /// returns - public virtual async Task AuthorizeAsync(AuthorizationPolicy policy, AuthenticateResult authenticationResult, HttpContext context, object resource) + public virtual Task AuthorizeAsync(AuthorizationPolicy policy, AuthenticateResult authenticationResult, HttpContext context, object resource) { - if (policy == null) - { - throw new ArgumentNullException(nameof(policy)); - } - - var result = await _authorization.AuthorizeAsync(context.User, resource, policy); - if (result.Succeeded) - { - return PolicyAuthorizationResult.Success(); - } - - // If authentication was successful, return forbidden, otherwise challenge - return (authenticationResult.Succeeded) - ? PolicyAuthorizationResult.Forbid() - : PolicyAuthorizationResult.Challenge(); + return _commonPolicyEvaluator.AuthorizeAsync(policy, authenticationResult.Succeeded, context.User, resource); } } -} \ No newline at end of file +} diff --git a/src/Security/Authorization/Core/src/Resources.resx b/src/Security/Authorization/Core/src/Resources.resx index ebf1328616db..15d6f7d53c0f 100644 --- a/src/Security/Authorization/Core/src/Resources.resx +++ b/src/Security/Authorization/Core/src/Resources.resx @@ -117,15 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - AuthorizationPolicy must have at least one requirement. - - - The AuthorizationPolicy named: '{0}' was not found. - - - At least one role must be specified. - Unable to find the required services. Please add all the required services by calling '{0}.{1}' inside the call to '{2}' in the application startup code. diff --git a/src/Security/Security.sln b/src/Security/Security.sln index cf56b8509166..be42e8afc8b6 100644 --- a/src/Security/Security.sln +++ b/src/Security/Security.sln @@ -136,6 +136,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routin EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "..\Servers\IIS\IISIntegration\src\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{FD3AB895-2AF6-447D-82CF-DB002B491D23}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization.Common", "Authorization\Common\src\Microsoft.AspNetCore.Authorization.Common.csproj", "{2DA3C692-349E-4FC5-A559-3227088DA9D2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization.Common.Abstractions", "Authorization\Common.Abstractions\src\Microsoft.AspNetCore.Authorization.Common.Abstractions.csproj", "{4C022272-CC58-4538-AF25-C1F5106B428D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -350,6 +354,14 @@ Global {FD3AB895-2AF6-447D-82CF-DB002B491D23}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD3AB895-2AF6-447D-82CF-DB002B491D23}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD3AB895-2AF6-447D-82CF-DB002B491D23}.Release|Any CPU.Build.0 = Release|Any CPU + {2DA3C692-349E-4FC5-A559-3227088DA9D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DA3C692-349E-4FC5-A559-3227088DA9D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DA3C692-349E-4FC5-A559-3227088DA9D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DA3C692-349E-4FC5-A559-3227088DA9D2}.Release|Any CPU.Build.0 = Release|Any CPU + {4C022272-CC58-4538-AF25-C1F5106B428D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C022272-CC58-4538-AF25-C1F5106B428D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C022272-CC58-4538-AF25-C1F5106B428D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C022272-CC58-4538-AF25-C1F5106B428D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -417,6 +429,8 @@ Global {5B2F3890-198E-4BE8-8464-10B4D97F976A} = {A3766414-EB5C-40F7-B031-121804ED5D0A} {71961A8D-B26F-46AE-A475-D00425D875A0} = {A3766414-EB5C-40F7-B031-121804ED5D0A} {FD3AB895-2AF6-447D-82CF-DB002B491D23} = {A3766414-EB5C-40F7-B031-121804ED5D0A} + {2DA3C692-349E-4FC5-A559-3227088DA9D2} = {F6A3381D-978A-4CBF-BC72-862FB75CD6AF} + {4C022272-CC58-4538-AF25-C1F5106B428D} = {F6A3381D-978A-4CBF-BC72-862FB75CD6AF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {ABF8089E-43D0-4010-84A7-7A9DCFE49357}