Repository navigation
Expand file tree
/
Copy pathApiSecurityConfiguration.cs
More file actions
130 lines (114 loc) · 5.3 KB
/
Copy pathApiSecurityConfiguration.cs
File metadata and controls
130 lines (114 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Principal;
using System.Text;
using Trivelum.API.Models;
namespace Trivelum.API.Configurations
{
public static class ApiSecurityConfiguration
{
private static byte[] secretKey;
private static TokenDescriptor tokenDescriptor;
public static void AddApiSecurity(this IServiceCollection services, IConfiguration configuration)
{
if (services == null) throw new ArgumentNullException(nameof(services));
tokenDescriptor = new TokenDescriptor();
new ConfigureFromConfigurationOptions<TokenDescriptor>(
configuration.GetSection("JwtTokenOptions"))
.Configure(tokenDescriptor);
services.AddSingleton(tokenDescriptor);
secretKey = Encoding.ASCII.GetBytes(configuration["JwtTokenOptions:SecretKey"]);
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(bearerOptions =>
{
bearerOptions.RequireHttpsMetadata = false;
bearerOptions.SaveToken = true;
bearerOptions.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = new SymmetricSecurityKey(secretKey),
ValidAudience = tokenDescriptor.Audience,
ValidIssuer = tokenDescriptor.Issuer,
ValidateIssuerSigningKey = true,
//ValidateIssuer = false,
//ValidateAudience = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromMinutes(10) // Considerar possível diferença de data e hora entre servidores
};
});
services.AddAuthorization(options =>
{
options.AddPolicy("Turista", policy => { policy.RequireClaim("turista", "1"); });
options.AddPolicy("Agencia", policy => { policy.RequireClaim("agencia", "1"); });
options.AddPolicy("Agente", policy => { policy.RequireClaim("agente", "1"); });
options.AddPolicy("Autenticado", policy => { policy.RequireAuthenticatedUser(); });
//options.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
// .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
// .RequireAuthenticatedUser().Build());
});
}
public static string GerarToken(UsuarioViewModel usuarioViewModel)
{
var tokenHandler = new JwtSecurityTokenHandler();
var allClaims = new List<Claim>();
allClaims.Add(new Claim(JwtRegisteredClaimNames.Sub, usuarioViewModel.Id.ToString()));
allClaims.Add(new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()));
switch (usuarioViewModel.TipoUsuario)
{
case TipoUsuario.Turista:
{
allClaims.Add(new Claim("turista", "1"));
break;
}
case TipoUsuario.Agencia:
{
allClaims.Add(new Claim("agencia", "1"));
break;
}
case TipoUsuario.GuiaTurismo:
{
allClaims.Add(new Claim("agente", "1"));
break;
}
case TipoUsuario.Responsavel:
{
allClaims.Add(new Claim("agente", "1"));
break;
}
}
var minutesValid = tokenDescriptor.MinutesValid;
if (usuarioViewModel.TipoUsuario == TipoUsuario.Turista || usuarioViewModel.TipoUsuario == TipoUsuario.GuiaTurismo || usuarioViewModel.TipoUsuario == TipoUsuario.Responsavel)
minutesValid = 525600;
var securityToken = new SecurityTokenDescriptor
{
Audience = tokenDescriptor.Audience,
Issuer = tokenDescriptor.Issuer,
Subject = new ClaimsIdentity(
new GenericIdentity(usuarioViewModel.Id.ToString(), "Login"),
allClaims
),
NotBefore = DateTime.UtcNow.AddMinutes(-15),
Expires = DateTime.UtcNow.AddMinutes(minutesValid),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(secretKey), SecurityAlgorithms.HmacSha256Signature),
};
var token = tokenHandler.CreateToken(securityToken);
return tokenHandler.WriteToken(token);
}
}
public class TokenDescriptor
{
public string Audience { get; set; }
public string Issuer { get; set; }
public int MinutesValid { get; set; }
}
}