Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save DamianEdwards/6b2181c383f03c4fcf52058f7c5cb03c to your computer and use it in GitHub Desktop.
Save DamianEdwards/6b2181c383f03c4fcf52058f7c5cb03c to your computer and use it in GitHub Desktop.
Prototype pseudo-implementation of WebApplicationAuthorizationBuilder
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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment