public Task Invoke(HttpContext context) { if (!context.Request.Path.Equals(this._options.Path, StringComparison.Ordinal)) { return(this._requestDelegate(context)); } if (!context.Request.Method.Equals("POST") || !context.Request.HasFormContentType) { context.Response.StatusCode = (int)HttpStatusCode.BadRequest; return(context.Response.WriteAsync(CommonResponse.FromError("Bad request."))); } return(GenerateToken(context)); }
private async Task GenerateToken(HttpContext context) { var username = context.Request.Form["username"]; var password = context.Request.Form["pwhash"]; var identity = await GetIdentity(username, password); if (identity == null) { context.Response.StatusCode = 400; await context.Response.WriteAsync(CommonResponse.FromError("Invalid username or password.")); return; } var now = DateTimeOffset.UtcNow; var claims = new [] { new Claim(JwtRegisteredClaimNames.Sub, username), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.Iat, now.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64) }; var jwt = new JwtSecurityToken( issuer: this._options.Issuer, audience: this._options.Audience, expires: now.Add(this._options.Expiration).DateTime, signingCredentials: this._options.SigningCredentials, claims: claims, notBefore: now.DateTime ); var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt); var tokenResponse = new TokenResponse(encodedJwt, (int)this._options.Expiration.TotalSeconds); context.Response.ContentType = "application/json"; await context.Response.WriteAsync(JsonConvert.SerializeObject(tokenResponse, new JsonSerializerSettings { Formatting = Formatting.Indented })); }