118 lines
4.4 KiB
C#
118 lines
4.4 KiB
C#
using Serilog;
|
|
|
|
namespace Microsoft.eShopOnContainers.Services.Identity.API;
|
|
|
|
public static class ProgramExtensions
|
|
{
|
|
private const string AppName = "Identity API";
|
|
|
|
public static void AddCustomConfiguration(this WebApplicationBuilder builder)
|
|
{
|
|
builder.Configuration.AddConfiguration(GetConfiguration()).Build();
|
|
|
|
}
|
|
|
|
public static void AddCustomSerilog(this WebApplicationBuilder builder)
|
|
{
|
|
var seqServerUrl = builder.Configuration["SeqServerUrl"];
|
|
var logstashUrl = builder.Configuration["LogstashgUrl"];
|
|
|
|
Log.Logger = new LoggerConfiguration()
|
|
.MinimumLevel.Verbose()
|
|
.Enrich.WithProperty("ApplicationContext", AppName)
|
|
.Enrich.FromLogContext()
|
|
.WriteTo.Console()
|
|
.WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl)
|
|
.WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://localhost:8080" : logstashUrl, null)
|
|
.ReadFrom.Configuration(builder.Configuration)
|
|
.CreateLogger();
|
|
|
|
builder.Host.UseSerilog();
|
|
}
|
|
|
|
public static void AddCustomMvc(this WebApplicationBuilder builder)
|
|
{
|
|
builder.Services.AddControllersWithViews();
|
|
builder.Services.AddControllers();
|
|
builder.Services.AddRazorPages();
|
|
|
|
}
|
|
|
|
|
|
public static void AddCustomDatabase(this WebApplicationBuilder builder) =>
|
|
builder.Services.AddDbContext<ApplicationDbContext>(
|
|
options => options.UseSqlServer(builder.Configuration.GetConnectionString("IdentityDb")));
|
|
|
|
public static void AddCustomIdentity(this WebApplicationBuilder builder)
|
|
{
|
|
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
|
|
.AddEntityFrameworkStores<ApplicationDbContext>()
|
|
.AddDefaultTokenProviders();
|
|
}
|
|
|
|
|
|
public static void AddCustomIdentityServer(this WebApplicationBuilder builder)
|
|
{
|
|
var identityServerBuilder = builder.Services.AddIdentityServer(options =>
|
|
{
|
|
options.IssuerUri = "null";
|
|
options.Authentication.CookieLifetime = TimeSpan.FromHours(2);
|
|
|
|
options.Events.RaiseErrorEvents = true;
|
|
options.Events.RaiseInformationEvents = true;
|
|
options.Events.RaiseFailureEvents = true;
|
|
options.Events.RaiseSuccessEvents = true;
|
|
})
|
|
.AddInMemoryIdentityResources(Config.GetResources())
|
|
.AddInMemoryApiScopes(Config.GetApiScopes())
|
|
.AddInMemoryApiResources(Config.GetApis())
|
|
.AddInMemoryClients(Config.GetClients(builder.Configuration))
|
|
.AddAspNetIdentity<ApplicationUser>();
|
|
|
|
// not recommended for production - you need to store your key material somewhere secure
|
|
identityServerBuilder.AddDeveloperSigningCredential();
|
|
}
|
|
|
|
public static void AddCustomAuthentication(this WebApplicationBuilder builder)
|
|
{
|
|
builder.Services.AddAuthentication();
|
|
}
|
|
|
|
public static void AddCustomHealthChecks(this WebApplicationBuilder builder)
|
|
{
|
|
builder.Services.AddHealthChecks()
|
|
.AddCheck("self", () => HealthCheckResult.Healthy())
|
|
.AddSqlServer(builder.Configuration.GetConnectionString("IdentityDb"),
|
|
name: "IdentityDB-check",
|
|
tags: new string[] { "IdentityDB" });
|
|
}
|
|
|
|
public static void AddCustomApplicationServices(this WebApplicationBuilder builder)
|
|
{
|
|
builder.Services.AddTransient<IProfileService, ProfileService>();
|
|
builder.Services.AddTransient<ILoginService<ApplicationUser>, EFLoginService>();
|
|
builder.Services.AddTransient<IRedirectService, RedirectService>();
|
|
}
|
|
|
|
static IConfiguration GetConfiguration()
|
|
{
|
|
var builder = new ConfigurationBuilder()
|
|
.SetBasePath(Directory.GetCurrentDirectory())
|
|
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
|
|
.AddEnvironmentVariables();
|
|
|
|
var config = builder.Build();
|
|
|
|
if (config.GetValue<bool>("UseVault", false))
|
|
{
|
|
TokenCredential credential = new ClientSecretCredential(
|
|
config["Vault:TenantId"],
|
|
config["Vault:ClientId"],
|
|
config["Vault:ClientSecret"]);
|
|
builder.AddAzureKeyVault(new Uri($"https://{config["Vault:Name"]}.vault.azure.net/"), credential);
|
|
}
|
|
|
|
return builder.Build();
|
|
}
|
|
}
|