2017-08-10 79 views
1

我所有的REST API方法开始与该代码如下:如何避免使用样板代码验证ASP.NET Web API 2中的JWT令牌?

[HttpPost] 
[Route("Login")] 
public async Task<IHttpActionResult> Login(QueryModel q) 
{ 
    // get JWT Token string form HTTP Header 
    string token = Request.Headers.GetValues("Authorization").FirstOrDefault(); 

    // decode token 
    string json = Jose.JWT.Decode(token, JWTModel.secretForAccessToken); 
    JWTModel jwt = JsonConvert.DeserializeObject<JWTModel>(json); 

    // check if issued from my homepage. 
    if (!jwt.iss.Equals("my-home-page.com")) 
    { 
     return Content(
      HttpStatusCode.Unauthorized, 
      "access token is not from here" 
     ); 
    } 
    // check if it has valid about time 
    long now = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; 
    if (jwt.iat > now || jwt.exp < now) 
    { 
     // request refresh token 
     return Content(
      HttpStatusCode.Unauthorized, 
      "outdated access token" 
     ); 
    } 
    /* ... */ 
} 

多么可笑和多余的是他们!

我可以简化和调整它们吗?如何?

(在Node.js的,我可以用所谓的中间件解决这个问题。)

回答

0

我建议你看看DelegatingHandler,或者如果您运行的是基于OWIN应用程序,那么你可以创建中间件

DelegatingHandler MSDN Link

OWIN Middleware MSDN

+0

我不使用OWIN,但DelegatingHandler看起来很爽。我将立即将其应用于我的代码!我会报告结果。 –

+0

我终于实现了使用'DelegatingHandler'清理我的代码! [此文档](https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/http-message-handlers#example-checking-for-an-api-key)也有帮助。 –