aboutsummaryrefslogtreecommitdiff
path: root/Timeline/Services/JwtService.cs
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-02-07 00:39:51 +0800
committercrupest <crupest@outlook.com>2019-02-07 00:39:51 +0800
commit101631a0041f22570d7c2d9378cbfd0cec5ca14b (patch)
tree93a50ac104e1f590f9d7aa3d8f0e140a0992035d /Timeline/Services/JwtService.cs
parent478dfefdbf4b118d7453673a3aa93a638586b850 (diff)
downloadtimeline-101631a0041f22570d7c2d9378cbfd0cec5ca14b.tar.gz
timeline-101631a0041f22570d7c2d9378cbfd0cec5ca14b.tar.bz2
timeline-101631a0041f22570d7c2d9378cbfd0cec5ca14b.zip
Add authorization.
Diffstat (limited to 'Timeline/Services/JwtService.cs')
-rw-r--r--Timeline/Services/JwtService.cs64
1 files changed, 64 insertions, 0 deletions
diff --git a/Timeline/Services/JwtService.cs b/Timeline/Services/JwtService.cs
new file mode 100644
index 00000000..1b465dd9
--- /dev/null
+++ b/Timeline/Services/JwtService.cs
@@ -0,0 +1,64 @@
+using Microsoft.Extensions.Options;
+using Microsoft.IdentityModel.Tokens;
+using System;
+using System.Collections.Generic;
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using Timeline.Configs;
+using Timeline.Entities;
+
+namespace Timeline.Services
+{
+ public interface IJwtService
+ {
+ /// <summary>
+ /// Create a JWT token for a given user.
+ /// Return null if <paramref name="user"/> is null.
+ /// </summary>
+ /// <param name="user">The user to generate token.</param>
+ /// <returns>The generated token or null if <paramref name="user"/> is null.</returns>
+ string GenerateJwtToken(User user);
+ }
+
+ public class JwtService : IJwtService
+ {
+ private readonly IOptionsMonitor<JwtConfig> _jwtConfig;
+ private readonly JwtSecurityTokenHandler _tokenHandler = new JwtSecurityTokenHandler();
+
+ public JwtService(IOptionsMonitor<JwtConfig> jwtConfig)
+ {
+ _jwtConfig = jwtConfig;
+ }
+
+ public string GenerateJwtToken(User user)
+ {
+ if (user == null)
+ return null;
+
+ var jwtConfig = _jwtConfig.CurrentValue;
+
+ var identity = new ClaimsIdentity();
+ identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));
+ identity.AddClaims(user.Roles.Select(role => new Claim(identity.RoleClaimType, role)));
+
+ var tokenDescriptor = new SecurityTokenDescriptor()
+ {
+ Subject = identity,
+ Issuer = jwtConfig.Issuer,
+ Audience = jwtConfig.Audience,
+ SigningCredentials = new SigningCredentials(
+ new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig.SigningKey)), SecurityAlgorithms.HmacSha384),
+ IssuedAt = DateTime.Now,
+ Expires = DateTime.Now.AddDays(1)
+ };
+
+ var token = _tokenHandler.CreateToken(tokenDescriptor);
+ var tokenString = _tokenHandler.WriteToken(token);
+
+ return tokenString;
+ }
+ }
+}