summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Program.cs5
-rw-r--r--Services/ITokenGenerator.cs8
-rw-r--r--Services/TokenGenerator.cs39
3 files changed, 52 insertions, 0 deletions
diff --git a/Program.cs b/Program.cs
index 22bf80e..0bcd2cb 100644
--- a/Program.cs
+++ b/Program.cs
@@ -7,6 +7,7 @@ using System.Text.Json.Serialization;
using System.Text;
using Microsoft.EntityFrameworkCore;
using BackendPIA.Models;
+using BackendPIA.Services;
var builder = WebApplication.CreateBuilder(args);
@@ -20,6 +21,10 @@ builder.Services.AddIdentity<UserAccount, IdentityRole>().AddEntityFrameworkStor
// Automapper configuration.
builder.Services.AddAutoMapper(typeof(Program));
+// Custom services configuration.
+builder.Services.AddSingleton<ITokenGenerator>(s => new TokenGenerator(builder.Configuration["Jwt:Key"]));
+// End of custom services configuration.
+
// Swagger configuration.
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c => {
diff --git a/Services/ITokenGenerator.cs b/Services/ITokenGenerator.cs
new file mode 100644
index 0000000..3738f81
--- /dev/null
+++ b/Services/ITokenGenerator.cs
@@ -0,0 +1,8 @@
+using BackendPIA.Models;
+
+namespace BackendPIA.Services {
+ public interface ITokenGenerator {
+ public string Generate(UserAccount user, string role);
+ public string GenerateRefreshToken();
+ }
+} \ No newline at end of file
diff --git a/Services/TokenGenerator.cs b/Services/TokenGenerator.cs
new file mode 100644
index 0000000..7d9d1ec
--- /dev/null
+++ b/Services/TokenGenerator.cs
@@ -0,0 +1,39 @@
+using Microsoft.IdentityModel.Tokens;
+using System.IdentityModel.Tokens.Jwt;
+using Microsoft.AspNetCore.Identity;
+using System.Text;
+using System.Security.Claims;
+using System.Security.Cryptography;
+using BackendPIA.Models;
+
+namespace BackendPIA.Services {
+ public class TokenGenerator : ITokenGenerator {
+ private readonly string _key;
+ public TokenGenerator(string key) {
+ _key = key;
+ }
+
+ public string Generate(UserAccount user, string role) {
+ var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_key));
+ var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
+ var expiration = DateTime.UtcNow.AddMinutes(30);
+ //var issuer = _configuration["Jwt:Issuer"];
+ var claims = new List<Claim> {
+ new Claim("sid", user.Id),
+ new Claim("username", user.UserName),
+ new Claim("email", user.Email),
+ new Claim("role", role)
+ };
+ var descriptor = new JwtSecurityToken(issuer: null, audience: null, claims: claims, expires: expiration, signingCredentials: creds);
+
+ return new JwtSecurityTokenHandler().WriteToken(descriptor);
+ }
+
+ public string GenerateRefreshToken() {
+ byte[] random_number = new byte[16];
+ RandomNumberGenerator rng = RandomNumberGenerator.Create();
+ rng.GetBytes(random_number);
+ return string.Join("", random_number);
+ }
+ }
+} \ No newline at end of file