我使用基于令牌的身份验证来保护我的Web Api。一切运作良好,但是现在在进行api调用之前,我通过单独的api调用来请求令牌,这将返回令牌以进一步请求。我想知道有没有可能的方法,我可以在客户端生成将在服务器上解密的令牌? 要么 你的想法,我走在正确的轨道上?
这是我的jQuery代码
$.when($.get("/api/service/GetToken"))
.done(function (token) {
doAjaxCall("GET", "/api/service/GetAllJobsStatusCount/1/admin", "{}", "json", token, function (data) {
console.log(data);
});
});
这是我的方法,它会返回我的标记
[Api.HttpGet]
public string GetToken()
{
var authorizeToken = "apikey";
return Rsa.Encrypt(authorizeToken);
}
请建议
答案 0 :(得分:0)
如果使用加密连接(HTTPS),单个令牌仅适用于身份验证 - 否则,MITM可以读取令牌并窃取身份。如果一切都是使用安全连接完成的,那么只要在任何认证之前交换令牌并不重要,只要在任何认证之前进行交换,所以双方都事先知道 - 否则就无法知道它是否有效。但请注意,令牌始终只能证明客户端是令牌首先被给予(或从中接收)的客户端,您仍然不知道其他任何东西(例如,如果另一个人是他声称的那个人)当交换时)。
如果不使用安全连接,我建议使用公钥加密。如果不加密整个请求,请计算签名并使用私钥客户端对其进行签名,并在服务器端验证。在这种情况下,客户端必须计算私钥和公钥,并将公钥交给服务器,因为服务器永远不应该知道客户端的私钥(并且它不应该通过未加密的连接发送,之后这就是使用PKI的全部意义。
对于另一种方法(广泛使用,但不是特别安全),请参阅OAuth。
[编辑]:根据评论添加:
要验证客户端,必须对访问有价值数据的每个请求进行身份验证。这意味着:客户端需要发送一些能够证明它与每个请求一起声明的内容(因为HTTP是无状态协议)。
通常的方法是交换一次秘密,这在有限时间或永久有效,并且只有客户和服务员知道。这样,服务器可以通过检查客户端是否发送了给定的令牌来验证身份。在提高安全性之后使令牌过期,但是当客户端请求知道的令牌时,无法判断它是否是使用旧令牌的客户端(除非请求由旧令牌验证并且该令牌仍然有效)。 如果客户端计算令牌,则deosn'T更改任何内容 - 它发送一次并告诉服务器它是谁,然后每个携带相同令牌的请求很可能来自同一客户端。服务器只需要执行一项额外的操作:如果两个客户端计算相同的令牌,则服务器必须拒绝来自第二个客户端的令牌并请求另一个令牌。否则,客户就不能再被区分了。