|
public class WebApplicationAuthorizationBuilder |
|
{ |
|
private readonly WebApplicationBuilder _builder; |
|
|
|
public WebApplicationAuthorizationBuilder(WebApplicationBuilder builder) |
|
{ |
|
_builder = builder; |
|
} |
|
|
|
public WebApplicationAuthorizationBuilder AddPolicy( |
|
string name, |
|
Action<AuthorizationPolicyBuilder> configurePolicy, |
|
bool setAsDefault = false, |
|
bool setAsFallback = false) |
|
{ |
|
_builder.Services.AddAuthorization(authzOptions => |
|
{ |
|
var policyBuilder = new AuthorizationPolicyBuilder(); |
|
configurePolicy(policyBuilder); |
|
var policy = policyBuilder.Build(); |
|
|
|
authzOptions.AddPolicy(name, policy); |
|
|
|
if (setAsDefault) |
|
{ |
|
authzOptions.DefaultPolicy = policy; |
|
} |
|
|
|
if (setAsFallback) |
|
{ |
|
authzOptions.FallbackPolicy = policy; |
|
} |
|
}); |
|
|
|
return this; |
|
} |
|
|
|
public WebApplicationAuthorizationBuilder SetDefaultPolicy(string name) |
|
{ |
|
_builder.Services.AddAuthorization(authzOptions => |
|
{ |
|
if (authzOptions.GetPolicy(name) is AuthorizationPolicy policy) |
|
{ |
|
authzOptions.DefaultPolicy = policy; |
|
} |
|
else |
|
{ |
|
throw new InvalidOperationException($"Can't find policy named '{name}'."); |
|
} |
|
}); |
|
|
|
return this; |
|
} |
|
|
|
public WebApplicationAuthorizationBuilder SetFallbackPolicy(string name) |
|
{ |
|
_builder.Services.Configure<AuthorizationOptions>(authzOptions => |
|
{ |
|
if (authzOptions.GetPolicy(name) is AuthorizationPolicy policy) |
|
{ |
|
authzOptions.FallbackPolicy = policy; |
|
} |
|
else |
|
{ |
|
throw new InvalidOperationException($"Can't find policy named '{name}'."); |
|
} |
|
}); |
|
|
|
return this; |
|
} |
|
|
|
public WebApplicationAuthorizationBuilder Configure(Action<AuthorizationOptions> configure) |
|
{ |
|
_builder.Services.Configure(configure); |
|
|
|
return this; |
|
} |
|
} |
|
|
|
public static class WebApplicationBuilderExtensions |
|
{ |
|
private static readonly object _key = new(); |
|
|
|
public static WebApplicationAuthorizationBuilder Authorization(this WebApplicationBuilder builder) |
|
{ |
|
if (builder.Host.Properties.TryGetValue(_key, out var value) && value is WebApplicationAuthorizationBuilder authzBuilder) |
|
{ |
|
return authzBuilder; |
|
} |
|
|
|
if (value is { }) |
|
{ |
|
throw new InvalidOperationException("There's a different object living in our slot!"); |
|
} |
|
|
|
authzBuilder = new WebApplicationAuthorizationBuilder(builder); |
|
builder.Host.Properties.Add(_key, authzBuilder); |
|
return authzBuilder; |
|
} |
|
} |