我有一个3层应用程序 - TMG,Web Server App Server。 我的Web服务器充当app app中的Web api的客户端。 api只会由我的Web服务器使用。我没有登录我的应用程序。所有数据都将公开。
为了安全起见,我使用https /端口443进行不同层之间的通信。
我还有一个我想要使用的网络帐户,如
HttpClientHandler handler = new HttpClientHandler
{
UseDefaultCredentials = true
};
Client = new HttpClient(handler);
此外,我还想在请求标头中添加加密的身份验证令牌。
我正在阅读有关http://dotnetopenauth.net/和Looking for samples of using DotNetOpenAuth with WebAPI的内容 - 但这看起来非常复杂。对于第一次在网络服务上工作的人。 另外根据我对dotnetopenauth的理解,还有像fb,twitter,google这样的第三方身份,因为我的应用程序没有登录,因此我觉得我需要这些身份。
我正在考虑将我的注册表中的密钥添加到我的Web服务器并加密它与请求标头一起发送。将相同的密钥添加到应用服务器解密它匹配它并允许通信。 - 这有意义吗?
让我再说一次,我从未在任何形式的网络服务中工作过。所以我会很感激回复并提供详细解释。
答案 0 :(得分:1)
我在移动应用上做了以下操作。这些步骤中的每一步都很容易实现:
1. On the client side get the UTC Unix timestamp and convert to string
2. Add a special password (called salt) to the end of the string
3. Convert it to a Sha1 string
4. Now you have 2 extra pieces of data, the timestamp and the resulting hashcode
5. Send the timestamp and hashcode along with the request to your web api
在Web API方面:
1. Create a Unix UTC timestamp. Subtract it from the timestamp that was sent to you, if it's greater than say 10 minutes reject the request.
2. Take the timestamp sent to you, add the salt to the string and hash it, if it equals the hashcode the client sent you then the request is still ok, otherwise reject it.
3. Search an array (or however you want to store values) for the timestamp that was sent to you. If its not in the array then store it in the array. If it is in the array then reject the request. You should be using a timestamp down to millisecond for all of this.
答案 1 :(得分:0)
最简单的方法是在Web服务器和WebApi服务器之间的TLS通信中使用客户端证书。然后在WebAPI中,您只接受来自具有已知证书的客户端(Web服务器)的连接。