ENEI2019-Public/api/Startup.cs

145 lines
5.2 KiB
C#
Raw Normal View History

2018-12-12 15:17:08 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using api.Data;
using api.Helpers;
using api.Models;
using AutoMapper;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
2019-02-14 19:08:51 +00:00
using Pomelo.EntityFrameworkCore.MySql;
2018-12-12 15:17:08 +00:00
namespace api
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
2019-03-12 03:34:40 +00:00
services.AddHttpClient();
2018-12-12 15:17:08 +00:00
services.AddAutoMapper();
services.AddScoped<IUsersRepository, UsersRepository>();
2019-02-26 01:52:05 +00:00
services.AddScoped<IEventsRepository, EventsRepository>();
2019-03-06 19:17:36 +00:00
services.AddScoped<ITeamsRepository, TeamsRepository>();
services.AddScoped<IEventLocsRepository, EventLocsRepository>();
services.AddScoped<IEventLocsVisitedRepository, EventLocsVisitedRepository>();
2018-12-12 15:17:08 +00:00
//define a connection string indicada em appsettings.json
2019-02-14 19:08:51 +00:00
services.AddDbContext<DataContext>(x=>x.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
2018-12-12 15:17:08 +00:00
2019-02-21 00:09:38 +00:00
2018-12-12 15:17:08 +00:00
IdentityBuilder builder = services.AddIdentityCore<User>(Options=>
{
//mudar isto no fim por questoes de segurança
Options.Password.RequireDigit = false;
Options.Password.RequiredLength=4;
Options.Password.RequireNonAlphanumeric= false;
Options.Password.RequireUppercase= false;
}
);
builder= new IdentityBuilder(builder.UserType,typeof(Role),builder.Services);
builder.AddEntityFrameworkStores<DataContext>();
builder.AddRoleValidator<RoleValidator<Role>>();
builder.AddRoleManager<RoleManager<Role>>();
builder.AddSignInManager<SignInManager<User>>();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options=> {
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration.GetSection("AppSettings:Token").Value)),
ValidateIssuer = false,
ValidateAudience= false,
};
});
services.AddAuthorization(options => {
options.AddPolicy("RequireAdminRole",policy => policy.RequireRole("Admin"));
//adicionar mais roles aqui
});
services.AddMvc(Options=>
{
var policy= new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
Options.Filters.Add(new AuthorizeFilter(policy));
}
).
SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
//cors support
services.AddCors();
services.AddMvc();
//autenticação para o token
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
2019-02-21 00:09:38 +00:00
//globar exception handler ∏
2018-12-12 15:17:08 +00:00
app.UseExceptionHandler(builder => {
builder.Run(async context => {
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
var error= context.Features.Get<IExceptionHandlerFeature>();
if(error!= null){
context.Response.AddApplicationError(error.Error.Message);
await context.Response.WriteAsync(error.Error.Message);
}
});
});
// app.UseHsts();
}
// app.UseHttpsRedirection();
//cores supporte
2019-02-21 00:09:38 +00:00
app.UseCors(x=>x.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
app.UseAuthentication();
app.UseMvc();
2018-12-12 15:17:08 +00:00
}
}
}