我的要求
我有一个Web API,可以从数据库中获取所需的数据。我有一个.Net网站,它使用这个Web API来获取所有数据。现在要求保护API免于暴露给网络上的任何人。
到目前为止我做了什么:
在网站上:
我在用户登录时生成令牌。此令牌包含用户名,随机密钥和令牌的到期时间等详细信息,所有这些都在加密字符串中。
在API上:
在每次请求时,在发送响应之前,我解密令牌并验证用户名,密钥和到期时间是否有效。如果所有这些都有效,则会发送响应。否则,将发送错误消息作为响应。 这是我改变的功能:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
AuthenticationHeaderValue authorization = request.Headers.Authorization;
if (authorization != null)
{
if (Encryption.DecryptData(token).Equals(ConfigurationManager.AppSettings["TokenKey"].ToString()))
{
//Send response
}
}
}
直到这里一切都很好。
现在问题是......
我们说我为令牌设置了15分钟的到期时间。因此,生成的令牌可以在登录后使用15分钟以获取API的响应。 无论用户的登录状态如何,都可以使用此令牌,即即使用户在登录后立即退出,令牌也有效15分钟。
过去几天我一直在集思广益并寻找解决方案,我想到了在会话中处理数据的想法,但后来发现在可扩展性方面这是一个坏主意。
还有一些限制,我不能使用OWIN。此外,该项目不是MVC,它是一个Web API项目。
有人可以来救我并指出我的解决方案吗?我将不胜感激,因为这已经消耗了很多时间。
答案 0 :(得分:0)
您无法使令牌无效。 如果用户有令牌,则表示他已登录。 我有这个问题,当我不得不使令牌无效时,我发现任何解决方法都不适用于你的情况。 how-to-force-invalid-bearer-token-in-web-api
如果用户拥有有效的令牌,那么他就像他一样好。当他退出时,你只能用令牌清除他的cookie。这不是一个错误,它是一个功能;)
最佳解决方案是接受此操作,并且不要担心用户想要使用其令牌做什么。
答案 1 :(得分:-1)
您可能正在某处存储令牌详细信息(可能是SQL数据库),以便在API中对其进行验证。为什么不添加一个字段&#34;启用&#34;在用户注销时设置为0的数据库中,然后让API检查该字段作为验证的一部分,以及检查用户,令牌和到期时间。