2015-10-24 79 views
1

我目前正在开发一个API,但我对如何保护它有点难以理解。我不想重新发明轮子,我也不是密码学方面的专家。用令牌保护API

我现在的计划如下:

  • 检查客户端通信的HTTPS

  • 检查客户端是否有令牌,如果他们不那么验证它,否则让他们登录(返回401)

验证令牌,我会检查它是否存在于数据库中,如果它检查它没有过期。

如果令牌不存在,我会要求他们验证。这将涉及通过HTTPS将他们的用户名和密码发送到服务器,我会使用传统方法(散列,加盐,比较等)检查它。如果全部检出,那么我会创建一个会话密钥/令牌/随机字符串,并在将来的所有请求中要求他们发送它们的API请求。

这听起来像一个明智的做法?

谢谢

+0

听起来不错。如果您发出数字签名的令牌,则不需要执行数据库查找。 – MvdD

+0

这听起来像是你试图重新发明轮子,对于这个主题可能是危险的 - 取决于什么版本的ASP.NET(例如OWIN),你可以使用已建立的方法根据你的场景发布和验证令牌。您在谈论授权(OAuth),同时也在讨论正确的密码存储。例如,请参阅:[链接](http://bitoftech.net/2015/01/21/asp-net-identity-2-with-asp-net-web-api-2-accounts-management/)。有大量的文章使用令牌,并在ASP.NET中正确存储密码。 –

回答

-1

对于初学者来说,这听起来不错。您在考虑的是基本身份验证,然后是基于令牌的授权。但是你也应该考虑使用某种混淆技术来发送用户名和密码。像base64一样,它只有一种特定的格式,只有你的算法可以在服务器端解密。这里有一个很好的教程,可以帮助你:http://www.codeproject.com/Articles/1005485/RESTful-Day-sharp-Security-in-Web-APIs-Basic

+0

您应该仅将基本身份验证与HTTPS结合使用,因此不需要混淆。此外,base64是一种编码,而不是加密。 – MvdD

+0

@MvdD我建议,作为一种额外的措施,我急于使用术语“解密”而不是“解码”。除此之外,我没有提出任何可怕的建议。 – lbrahim

0

你可以选择使用单点登录并将令牌生成委托给安全令牌服务,如Thinktecture's Identity Server。 然后在API方面,你将必须配置承载令牌认证,是这样的:

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
    { 
     Authority = "https://localhost:44319/identity", 
     RequiredScopes = new[] { "sampleApi" } 
    }); 

完整这里例如:https://identityserver.github.io/Documentation/docs/overview/mvcGettingStarted.html