Add DefaultPolicy support for AuthZ
This commit is contained in:
parent
b883920bef
commit
3294de14f4
|
|
@ -11,6 +11,11 @@ namespace Microsoft.AspNet.Authorization
|
||||||
{
|
{
|
||||||
private IDictionary<string, AuthorizationPolicy> PolicyMap { get; } = new Dictionary<string, AuthorizationPolicy>(StringComparer.OrdinalIgnoreCase);
|
private IDictionary<string, AuthorizationPolicy> PolicyMap { get; } = new Dictionary<string, AuthorizationPolicy>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The initial default policy is to require any authenticated user
|
||||||
|
/// </summary>
|
||||||
|
public AuthorizationPolicy DefaultPolicy { get; set; } = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
|
||||||
|
|
||||||
public void AddPolicy([NotNull] string name, [NotNull] AuthorizationPolicy policy)
|
public void AddPolicy([NotNull] string name, [NotNull] AuthorizationPolicy policy)
|
||||||
{
|
{
|
||||||
PolicyMap[name] = policy;
|
PolicyMap[name] = policy;
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ namespace Microsoft.AspNet.Authorization
|
||||||
foreach (var authorizeAttribute in attributes.OfType<AuthorizeAttribute>())
|
foreach (var authorizeAttribute in attributes.OfType<AuthorizeAttribute>())
|
||||||
{
|
{
|
||||||
any = true;
|
any = true;
|
||||||
var requireAnyAuthenticated = true;
|
var useDefaultPolicy = true;
|
||||||
if (!string.IsNullOrWhiteSpace(authorizeAttribute.Policy))
|
if (!string.IsNullOrWhiteSpace(authorizeAttribute.Policy))
|
||||||
{
|
{
|
||||||
var policy = options.GetPolicy(authorizeAttribute.Policy);
|
var policy = options.GetPolicy(authorizeAttribute.Policy);
|
||||||
|
|
@ -54,13 +54,13 @@ namespace Microsoft.AspNet.Authorization
|
||||||
throw new InvalidOperationException(Resources.FormatException_AuthorizationPolicyNotFound(authorizeAttribute.Policy));
|
throw new InvalidOperationException(Resources.FormatException_AuthorizationPolicyNotFound(authorizeAttribute.Policy));
|
||||||
}
|
}
|
||||||
policyBuilder.Combine(policy);
|
policyBuilder.Combine(policy);
|
||||||
requireAnyAuthenticated = false;
|
useDefaultPolicy = false;
|
||||||
}
|
}
|
||||||
var rolesSplit = authorizeAttribute.Roles?.Split(',');
|
var rolesSplit = authorizeAttribute.Roles?.Split(',');
|
||||||
if (rolesSplit != null && rolesSplit.Any())
|
if (rolesSplit != null && rolesSplit.Any())
|
||||||
{
|
{
|
||||||
policyBuilder.RequireRole(rolesSplit);
|
policyBuilder.RequireRole(rolesSplit);
|
||||||
requireAnyAuthenticated = false;
|
useDefaultPolicy = false;
|
||||||
}
|
}
|
||||||
var authTypesSplit = authorizeAttribute.ActiveAuthenticationSchemes?.Split(',');
|
var authTypesSplit = authorizeAttribute.ActiveAuthenticationSchemes?.Split(',');
|
||||||
if (authTypesSplit != null && authTypesSplit.Any())
|
if (authTypesSplit != null && authTypesSplit.Any())
|
||||||
|
|
@ -70,9 +70,9 @@ namespace Microsoft.AspNet.Authorization
|
||||||
policyBuilder.ActiveAuthenticationSchemes.Add(authType);
|
policyBuilder.ActiveAuthenticationSchemes.Add(authType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (requireAnyAuthenticated)
|
if (useDefaultPolicy)
|
||||||
{
|
{
|
||||||
policyBuilder.RequireAuthenticatedUser();
|
policyBuilder.Combine(options.DefaultPolicy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return any ? policyBuilder.Build() : null;
|
return any ? policyBuilder.Build() : null;
|
||||||
|
|
|
||||||
|
|
@ -16,16 +16,17 @@ namespace Microsoft.Framework.DependencyInjection
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IServiceCollection AddAuthorization([NotNull] this IServiceCollection services)
|
public static IServiceCollection AddAuthorization([NotNull] this IServiceCollection services)
|
||||||
{
|
|
||||||
return services.AddAuthorization(configureOptions: null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IServiceCollection AddAuthorization([NotNull] this IServiceCollection services, Action<AuthorizationOptions> configureOptions)
|
|
||||||
{
|
{
|
||||||
services.AddOptions();
|
services.AddOptions();
|
||||||
services.TryAdd(ServiceDescriptor.Transient<IAuthorizationService, DefaultAuthorizationService>());
|
services.TryAdd(ServiceDescriptor.Transient<IAuthorizationService, DefaultAuthorizationService>());
|
||||||
services.AddTransient<IAuthorizationHandler, PassThroughAuthorizationHandler>();
|
services.AddTransient<IAuthorizationHandler, PassThroughAuthorizationHandler>();
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IServiceCollection AddAuthorization([NotNull] this IServiceCollection services, [NotNull] Action<AuthorizationOptions> configureOptions)
|
||||||
|
{
|
||||||
|
services.ConfigureAuthorization(configureOptions);
|
||||||
|
return services.AddAuthorization();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -42,5 +42,29 @@ namespace Microsoft.AspNet.Authroization.Test
|
||||||
Assert.Equal(2, combined.Requirements.OfType<ClaimsAuthorizationRequirement>().Count());
|
Assert.Equal(2, combined.Requirements.OfType<ClaimsAuthorizationRequirement>().Count());
|
||||||
Assert.Equal(1, combined.Requirements.OfType<RolesAuthorizationRequirement>().Count());
|
Assert.Equal(1, combined.Requirements.OfType<RolesAuthorizationRequirement>().Count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanReplaceDefaultPolicy()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var attributes = new AuthorizeAttribute[] {
|
||||||
|
new AuthorizeAttribute(),
|
||||||
|
new AuthorizeAttribute("2") { ActiveAuthenticationSchemes = "dupe" }
|
||||||
|
};
|
||||||
|
var options = new AuthorizationOptions();
|
||||||
|
options.DefaultPolicy = new AuthorizationPolicyBuilder("default").RequireClaim("default").Build();
|
||||||
|
options.AddPolicy("2", policy => policy.RequireClaim("2"));
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var combined = AuthorizationPolicy.Combine(options, attributes);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(2, combined.ActiveAuthenticationSchemes.Count());
|
||||||
|
Assert.True(combined.ActiveAuthenticationSchemes.Contains("dupe"));
|
||||||
|
Assert.True(combined.ActiveAuthenticationSchemes.Contains("default"));
|
||||||
|
Assert.Equal(2, combined.Requirements.Count());
|
||||||
|
Assert.False(combined.Requirements.Any(r => r is DenyAnonymousAuthorizationRequirement));
|
||||||
|
Assert.Equal(2, combined.Requirements.OfType<ClaimsAuthorizationRequirement>().Count());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue