private async Task attachUserToContext(HttpContext context, IUserRepository userService, string token) { try { var tokenHandler = new JwtSecurityTokenHandler(); var secretKey = MySettings.GetSecretKey(); var key = Encoding.ASCII.GetBytes(secretKey); tokenHandler.ValidateToken(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false, // set clockskew to zero so tokens expire exactly at token expiration time (instead of 5 minutes later) ClockSkew = TimeSpan.Zero }, out SecurityToken validatedToken); var jwtToken = (JwtSecurityToken)validatedToken; var userId = Guid.Parse(jwtToken.Claims.First(x => x.Type == "id").Value); // attach user to context on successful jwt validation Result result = await userService.GetUserById(userId); var data = result.Data != null ? (List <User>)result.Data : null; User user = data.Count > 0 ? data[0] : null; context.Items["User"] = user; } catch { // do nothing if jwt validation fails // user is not attached to context so request won't have access to secure routes } }
private string generateJwtToken(Guid userId) { // generate token that is valid for 7 days var secretKey = MySettings.GetSecretKey(); var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(secretKey); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim("id", userId.ToString()) }), Expires = DateTime.UtcNow.AddDays(7), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return(tokenHandler.WriteToken(token)); }