我有一个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地址的请求来解决这个问题吗?
答案 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是一个不错的选择。