· 7 years ago · Apr 05, 2018, 12:32 PM
1public class Startup
2 {
3 private const string SecretKey = "iNivDmHLpUA223sqsfhqGbMRdRj1PVkH"; // todo: get this from somewhere secure
4 private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey));
5
6 public Startup(IConfiguration configuration)
7 {
8 Configuration = configuration;
9 }
10
11 public IConfiguration Configuration { get; }
12
13 // This method gets called by the runtime. Use this method to add services to the container.
14 public void ConfigureServices(IServiceCollection services)
15 {
16 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
17
18 services.AddMvc();
19 services.AddTransient<StatusShippingMethod>();
20 services.AddTransient<DataImport>();
21 services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));
22
23 services.Configure<RestApiSettings>(Configuration.GetSection("RestApiSettings"));
24
25 services.AddSingleton<IJwtFactory, JwtFactory>();
26 // jwt wire up
27 // Get options from app settings
28 var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions));
29
30 // Configure JwtIssuerOptions
31 services.Configure<JwtIssuerOptions>(options =>
32 {
33 options.Issuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
34 options.Audience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)];
35 options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256);
36 });
37
38 var tokenValidationParameters = new TokenValidationParameters
39 {
40 ValidateIssuer = true,
41 ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)],
42
43 ValidateAudience = true,
44 ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)],
45
46 ValidateIssuerSigningKey = true,
47 IssuerSigningKey = _signingKey,
48
49 RequireExpirationTime = false,
50 ValidateLifetime = true,
51 ClockSkew = TimeSpan.Zero
52 };
53
54 services.AddAuthentication(options =>
55 {
56 options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
57 options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
58
59 }).AddJwtBearer(configureOptions =>
60 {
61 configureOptions.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
62 configureOptions.TokenValidationParameters = tokenValidationParameters;
63 configureOptions.SaveToken = true;
64 });
65
66 // api user claim policy
67 services.AddAuthorization(options =>
68 {
69 options.AddPolicy("ApiUser", policy => policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol, Constants.Strings.JwtClaims.ApiAccess));
70
71 });
72
73 //services.AddIdentity<ApplicationUser, IdentityRole>
74 // (
75 // options =>
76 // {
77 // // Password settings
78 // options.Password.RequireDigit = false;
79 // options.Password.RequiredLength = 6;
80 // options.Password.RequireNonAlphanumeric = false;
81 // options.Password.RequireUppercase = false;
82 // options.Password.RequireLowercase = false;
83 // options.Password.RequiredUniqueChars = 0;
84 // }
85 // )
86 // .AddEntityFrameworkStores<ApplicationDbContext>()
87 // .AddDefaultTokenProviders();
88
89 // add identity
90 var builder = services.AddIdentityCore<ApplicationUser>(o =>
91 {
92 // configure identity options
93 o.Password.RequireDigit = false;
94 o.Password.RequireLowercase = false;
95 o.Password.RequireUppercase = false;
96 o.Password.RequireNonAlphanumeric = false;
97 o.Password.RequiredLength = 6;
98 });
99 builder = new IdentityBuilder(builder.UserType, typeof(IdentityRole), builder.Services);
100 builder.AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
101
102
103 }
104
105
106
107
108 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
109 public void Configure(IApplicationBuilder app, IHostingEnvironment env, StatusShippingMethod statusShippingSeed, DataImport dataImport)
110 {
111 if (env.IsDevelopment())
112 {
113 app.UseDeveloperExceptionPage();
114 app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
115 {
116 HotModuleReplacement = true
117 });
118 }
119 else
120 {
121 app.UseExceptionHandler("/Home/Error");
122 }
123
124 app.UseStaticFiles();
125 statusShippingSeed.Seed();
126 app.UseHangfireServer();
127 app.UseHangfireDashboard();
128 app.UseAuthentication();
129 RecurringJob.AddOrUpdate(() => dataImport.ImportAllData(), Cron.MinuteInterval(5));
130
131 app.UseMvc(routes =>
132 {
133 routes.MapRoute(
134 name: "default",
135 template: "{controller=Home}/{action=Index}/{id?}");
136
137 routes.MapSpaFallbackRoute(
138 name: "spa-fallback",
139 defaults: new { controller = "Home", action = "Index" });
140 });
141
142 }
143 }