Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
AngularASPNETCoreAuthentication/src/dotnetGigs/Startup.cs
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
145 lines (125 sloc)
5.67 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| |
using System; | |
using Microsoft.AspNetCore.Builder; | |
using Microsoft.AspNetCore.Hosting; | |
using Microsoft.Extensions.Configuration; | |
using Microsoft.Extensions.DependencyInjection; | |
using Microsoft.Extensions.Logging; | |
using DotNetGigs.Data; | |
using Microsoft.EntityFrameworkCore; | |
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; | |
using FluentValidation.AspNetCore; | |
using DotNetGigs.Models.Entities; | |
using AutoMapper; | |
using DotNetGigs.Auth; | |
using DotNetGigs.Models; | |
using Microsoft.IdentityModel.Tokens; | |
using System.Text; | |
using System.Net; | |
using DotNetGigs.Helpers; | |
using Microsoft.AspNetCore.Diagnostics; | |
using DotNetGigs.Extensions; | |
using Microsoft.AspNetCore.Http; | |
namespace DotNetGigs | |
{ | |
public class Startup | |
{ | |
private const string SecretKey = "iNivDmHLpUA223sqsfhqGbMRdRj1PVkH"; // todo: get this from somewhere secure | |
private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecretKey)); | |
public Startup(IHostingEnvironment env) | |
{ | |
var builder = new ConfigurationBuilder() | |
.SetBasePath(env.ContentRootPath) | |
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) | |
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) | |
.AddEnvironmentVariables(); | |
Configuration = builder.Build(); | |
} | |
public IConfigurationRoot Configuration { get; } | |
// This method gets called by the runtime. Use this method to add services to the container. | |
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 | |
public void ConfigureServices(IServiceCollection services) | |
{ | |
// Add framework services. | |
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), | |
b => b.MigrationsAssembly("dotnetGigs"))); | |
services.AddSingleton<IJwtFactory, JwtFactory>(); | |
// jwt wire up | |
// Get options from app settings | |
var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions)); | |
// Configure JwtIssuerOptions | |
services.Configure<JwtIssuerOptions>(options => | |
{ | |
options.Issuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)]; | |
options.Audience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)]; | |
options.SigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256); | |
}); | |
// api user claim policy | |
services.AddAuthorization(options => | |
{ | |
options.AddPolicy("ApiUser", policy => policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol, Constants.Strings.JwtClaims.ApiAccess)); | |
}); | |
services.AddIdentity<AppUser, IdentityRole> | |
(o => | |
{ | |
// configure identity options | |
o.Password.RequireDigit = false; | |
o.Password.RequireLowercase = false; | |
o.Password.RequireUppercase = false; | |
o.Password.RequireNonAlphanumeric = false; | |
o.Password.RequiredLength = 6; | |
}) | |
.AddEntityFrameworkStores<ApplicationDbContext>() | |
.AddDefaultTokenProviders(); | |
services.AddMvc().AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>()); | |
services.AddAutoMapper(); | |
} | |
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. | |
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) | |
{ | |
loggerFactory.AddConsole(); | |
if (env.IsDevelopment()) | |
{ | |
app.UseDeveloperExceptionPage(); | |
} | |
app.UseExceptionHandler( | |
builder => | |
{ | |
builder.Run( | |
async context => | |
{ | |
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; | |
context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); | |
var error = context.Features.Get<IExceptionHandlerFeature>(); | |
if (error != null) | |
{ | |
context.Response.AddApplicationError(error.Error.Message); | |
await context.Response.WriteAsync(error.Error.Message).ConfigureAwait(false); | |
} | |
}); | |
}); | |
var jwtAppSettingOptions = Configuration.GetSection(nameof(JwtIssuerOptions)); | |
var tokenValidationParameters = new TokenValidationParameters | |
{ | |
ValidateIssuer = true, | |
ValidIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)], | |
ValidateAudience = true, | |
ValidAudience = jwtAppSettingOptions[nameof(JwtIssuerOptions.Audience)], | |
ValidateIssuerSigningKey = true, | |
IssuerSigningKey = _signingKey, | |
RequireExpirationTime = false, | |
ValidateLifetime = false, | |
ClockSkew = TimeSpan.Zero | |
}; | |
app.UseJwtBearerAuthentication(new JwtBearerOptions | |
{ | |
AutomaticAuthenticate = true, | |
AutomaticChallenge = true, | |
TokenValidationParameters = tokenValidationParameters | |
}); | |
app.UseDefaultFiles(); | |
app.UseStaticFiles(); | |
app.UseMvc(); | |
} | |
} | |
} |