如何在没有单独登录的情况下保护Web API?

时间:2017-03-10 05:35:11

标签: asp.net-mvc asp.net-web-api asp.net-core identityserver4

我有一个api,根据输入计算一些数学并返回结果。

我有多个asp.net mvc网站,它们有一个javascript图表,根据用户输入/来自api的ajax调用更新图表

我希望网站和图表页面是开放式访问权限。人们应该能够查看/更新图表而无需登录。

但是,我不希望人们能够直接插入我的api并自己使用它。有人看到api输出的唯一一次应该是通过我自己的网站。

这可能吗?

我一直在阅读https://identityserver4.readthedocs.io,也许我误解了,但是如果没有将访问令牌暴露给javascript,就没有办法做到这一点?

我可以使用C#/ MVC获取访问令牌,以防止公开用户名/密码:

var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");

但是对于javascript图表进行api调用,它需要知道该令牌。

一旦我将令牌暴露给javascript,是什么阻止某人获得该令牌并使用它来调用api?即使令牌过期,他们也不能自动从我的网站抓取新令牌以再次使用他们的api呼叫吗?

如果有任何好处,我可以将所有sites / api移动到同一台服务器上。也许可以使用IP限制,但是再一次,有人不能发送带有欺骗性IP地址的请求来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您是否使用[AllowAnonymous]属性进行了检查。如果您将此属性放在要进行开放访问的“操作”上,则任何人都可以在不登录的情况下访问该方法。 如果您想允许访问特定的站点/源,请将其添加到您的web.config文件中 <system.webServer></system.webServer>.

<httpProtocol>
  <customHeaders>
    <remove name="Access-Control-Allow-Origin" />
    <add name="Access-Control-Allow-Origin" value="*" />
  </customHeaders>

见这里*意味着你允许每个人。您可以放置​​您的网站地址,而不是*只有您想要访问您的API。

让我知道你想要什么或其他什么。

答案 1 :(得分:0)

当您的网站呈现您的网页时,请在网页中加入加密的json令牌。令牌将包含时间戳。当您的页面调用您的api时,请包含令牌。您的服务解密令牌,验证时间戳小于NN分钟。如果其中任何一个失败,就没有业务。

这样,只有您的网站才会知道如何创建调用您的API所需的正确令牌。如果时间戳足够短,则无法重放令牌。

您可以了解令牌的结构/内容以及加密方式,AES是一个不错的选择。

相关问题