using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SpaServices.AngularCli;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using PointBlankSolutions;
using SafetyPlus.Audits.Code;
using SafetyPlus.Audits.Services;
namespace SafetyPlus.Audits
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
services.AddDistributedSqlServerCache(o =>
o.ConnectionString = Configuration.GetConnection("DistributedCache");
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp/dist"; });
services.AddScoped<IViewModelProvider, ViewModelProvider>();
services.AddScoped<IAuditServiceProvider, AuditServiceProvider>();
services.AddHttpContextAccessor();
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
app.UseDeveloperExceptionPage();
app.UseExceptionHandler("/Error");
var assembly = typeof(DesignConfiguration).Assembly;
var embeddedFileProvider = new EmbeddedFileProvider(
DesignConfiguration.Resources
app.UseHttpsRedirection();
app.UseStaticFiles(new StaticFileOptions
FileProvider = embeddedFileProvider
template: "{controller}/{action=Index}/{id?}");
spa.Options.SourcePath = "ClientApp";
spa.UseAngularCliServer(npmScript: "start");
public void Configure(IServiceCollection services, IConfiguration configuration)
services.AddScoped<IPasswordHasher<TUser>, PasswordHasherWithOldMembershipSupport<TUser>>();
services.AddIdentity<TUser, IdentityRole>(options =>
options.ClaimsIdentity.UserIdClaimType = "UserID";
.AddEntityFrameworkStores<AuthenticationContext<TUser>>()
.AddDefaultTokenProviders();
var connection = configuration.GetConnection("Authentication");
services.AddDbContext<AuthenticationContext<TUser>>(options =>
options.UseSqlServer(connection));
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<AuthMessageSender.ISmsSender, AuthMessageSender>();
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection;
using PointBlankSolutions.Authentication;
using PointBlankSolutions.Movement.Initialization;
using SafetyPlus.Audits.Model;
[assembly: HostingStartup(typeof(IdentityHostingStartup))]
namespace PointBlankSolutions.Movement.Initialization
public class IdentityHostingStartup : IHostingStartup
private readonly AuthenticationConfiguration<CustomUser> _authorization = new AuthenticationConfiguration<CustomUser>();
public void Configure(IWebHostBuilder builder)
builder.ConfigureServices((context, services) =>
_authorization.Configure(services, context.Configuration);
services.AddAuthentication()
.AddMicrosoftAccount(options =>
options.CallbackPath = "/signin-microsoft";
options.ClientId = "058915c9-43d5-46ed-91c5-a54a047ff8ba";
options.ClientSecret = "dztrtSMJ3]~=agSBCC9566]";
options.ClientId = "264604623547-q4qsi2d1brqoede37tvom0couv0g0lp3.apps.googleusercontent.com";
options.ClientSecret = "22-oZAD_m42yckB-J2jrKoYi";
options.AppId = "163379080858216";
options.AppSecret = "264ca7b63c10b101fa915de0d7d01faf";
options.ConsumerKey = "Fp3hlrvdy6BhEmsOSzHc8K3Rh";
options.ConsumerSecret = "1UpaDnhkB3Bq1iJIGq8DWK8NJtY9G0EHobNHg8p8ohVWfblvE1";
services.Configure<IdentityOptions>(options =>
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
options.User.RequireUniqueEmail = false;
services.ConfigureApplicationCookie(options =>
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;