LANCommander/LANCommander.Server/Extensions/IdentityExtensions.cs
2025-02-11 18:06:42 -06:00

101 lines
4.1 KiB
C#

using LANCommander.Server.Data.Models;
using LANCommander.Server.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.IdentityModel.Tokens;
using Serilog;
using System.Text;
using LANCommander.Server.Extensions;
using LANCommander.Server.Services.Models;
using Microsoft.AspNetCore.Authentication;
namespace LANCommander.Server;
public static class IdentityExtensions
{
public static void AddIdentity(this WebApplicationBuilder builder, Settings settings)
{
Log.Debug("Initializing Identity");
builder.Services.AddIdentityCore<User>((options) =>
{
options.SignIn.RequireConfirmedAccount = false;
options.SignIn.RequireConfirmedEmail = false;
options.Password.RequireNonAlphanumeric = settings.Authentication.PasswordRequireNonAlphanumeric;
options.Password.RequireLowercase = settings.Authentication.PasswordRequireLowercase;
options.Password.RequireUppercase = settings.Authentication.PasswordRequireUppercase;
options.Password.RequireDigit = settings.Authentication.PasswordRequireDigit;
options.Password.RequiredLength = settings.Authentication.PasswordRequiredLength;
})
.AddRoles<Role>()
.AddEntityFrameworkStores<Data.DatabaseContext>()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = false,
ValidateAudience = false,
// ValidAudience = configuration["JWT:ValidAudience"],
// ValidIssuer = configuration["JWT:ValidIssuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(settings.Authentication.TokenSecret))
};
})
.AddAuthenticationProviders(settings)
.AddIdentityCookies();
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.Secure = settings.Authentication.CookieSecurePolicy;
options.MinimumSameSitePolicy = settings.Authentication.MinimumSameSitePolicy;
});
builder.Services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Login";
options.LogoutPath = "/Logout";
options.AccessDeniedPath = "/AccessDenied";
});
}
public static AuthenticationBuilder AddAuthenticationProviders(this AuthenticationBuilder authBuilder, Settings settings)
{
foreach (var authenticationProvider in settings.Authentication.AuthenticationProviders)
{
try
{
switch (authenticationProvider.Type)
{
case AuthenticationProviderType.OAuth2:
authBuilder.AddOAuth(authenticationProvider);
break;
case AuthenticationProviderType.OpenIdConnect:
authBuilder.AddOpenIdConnect(authenticationProvider);
break;
case AuthenticationProviderType.Saml:
throw new NotImplementedException("SAML providers are not supported at this time.");
break;
}
}
catch (Exception ex)
{
Log.Error(ex, "Authentication Provider {Name} could not be registered",
authenticationProvider.Name);
}
}
return authBuilder;
}
}