diff options
author | crupest <crupest@outlook.com> | 2019-02-07 00:39:51 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2019-02-07 00:39:51 +0800 |
commit | 101631a0041f22570d7c2d9378cbfd0cec5ca14b (patch) | |
tree | 93a50ac104e1f590f9d7aa3d8f0e140a0992035d /Timeline/Services/JwtService.cs | |
parent | 478dfefdbf4b118d7453673a3aa93a638586b850 (diff) | |
download | timeline-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.cs | 64 |
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; + } + } +} |