Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使REST API只对已知的客户端作出响应_C#_Asp.net_Rest_Security_Api Key - Fatal编程技术网

C# 使REST API只对已知的客户端作出响应

C# 使REST API只对已知的客户端作出响应,c#,asp.net,rest,security,api-key,C#,Asp.net,Rest,Security,Api Key,我有一个.Net核心RESTAPI。和本地移动应用程序(也是SPA) 我的应用程序没有任何个人用户身份验证。这就像是免费服务 但我想确保只有最终用户试图通过本机移动应用程序或SPA访问该服务时,才能访问该服务。如果在浏览器上粘贴“获取/发布”链接,则不应访问该链接 可能吗 (如果不是一个完全安全的解决方案?至少是一个简单的解决方案(系统不容易被破解)?顺便说一句,目前正在使用一个简单的API密钥)请求中的人以及请求的执行者是谁? 我的应用程序没有任何个人用户身份验证。这就像是免费服务 用户身份验

我有一个.Net核心RESTAPI。和本地移动应用程序(也是SPA)

我的应用程序没有任何个人用户身份验证。这就像是免费服务

但我想确保只有最终用户试图通过本机移动应用程序或SPA访问该服务时,才能访问该服务。如果在浏览器上粘贴“获取/发布”链接,则不应访问该链接

可能吗

(如果不是一个完全安全的解决方案?至少是一个简单的解决方案(系统不容易被破解)?顺便说一句,目前正在使用一个简单的API密钥)

请求中的人以及请求的执行者是谁? 我的应用程序没有任何个人用户身份验证。这就像是免费服务

用户身份验证仅识别向API服务器发出的请求中的人,而不是正在执行的操作

这是一个误解,通常我会在任何资历的开发者中发现,因此我建议你阅读我写的文章,标题是“为什么你的移动应用程序需要Api密钥?”?。本节详细解释了访问API服务器的用户和内容之间的区别,但我将在此摘录主要内容:

什么是向API服务器发出请求的东西。它真的是你的移动应用程序的真实实例,还是一个机器人、一个自动脚本或一个攻击者用Postman之类的工具在你的API服务器上手动戳来戳去

是移动应用程序的用户,我们可以通过多种方式进行身份验证、授权和识别,比如使用OpenID Connect或OAUTH2流

在简历中,您需要考虑谁是API服务器能够对数据进行身份验证和授权访问的用户,并考虑什么是代表用户发出请求的软件

可能吗? 但我想确保只有最终用户试图通过本机移动应用程序或SPA访问该服务时,才能访问该服务。如果在浏览器上粘贴“获取/发布”链接,则不应访问该链接

可能吗

“是”和“不是”。。。好吧,我不喜欢断然使用这些断言中的任何一个,因为在软件中总是更像
,这要看情况而定,因此我将它们括在引号中;)

是的,适用于移动应用程序 对于移动应用程序,您可以使用移动应用程序认证概念给予高度信任,即
发出请求的内容确实是您的移动应用程序的原始版本和未受限制的版本,为了了解更多信息,我建议您阅读我对如何确保移动应用程序的API REST的问题提出的建议?,特别是保护API服务器的章节和可能更好的解决方案

不适用于Web应用程序 对于web应用程序,攻击者只需点击
F12
即可检查网页并查看网页上的所有源代码,因此,这里没有直接的解决方案来解决以高度自信知道该请求是做什么的问题,但这会让攻击者的生活更加艰难。我建议您阅读来自应用程序调用的安全api数据,特别是专门用于保护api服务器的部分

你想多跑一英里吗? 在对安全问题的任何回答中,我总是喜欢引用OWASP基金会的优秀作品。< /P> 用于API

OWASP API安全项目旨在通过强调不安全API中的潜在风险,并说明如何减轻这些风险,为软件开发人员和安全评估人员提供价值。为了实现这一目标,OWASP API安全项目将创建并维护一份前10位API安全风险文档,以及创建或评估API时最佳实践的文档门户

用于移动应用程序

OWASP移动安全项目是一个集中的资源,旨在为开发人员和安全团队提供构建和维护安全移动应用程序所需的资源。通过该项目,我们的目标是对移动安全风险进行分类,并提供开发控制,以减少其影响或被利用的可能性

:

《移动安全测试指南》(MSTG)是一本关于移动应用程序安全开发、测试和逆向工程的综合手册

用于Web应用程序 :

OWASP Web安全测试指南包括一个“最佳实践”渗透测试框架,用户可以在自己的组织中实施该框架,以及一个“低级”渗透测试指南,该指南描述了测试最常见Web应用程序和Web服务安全问题的技术


对于我的API,我只是做了一个通用的身份验证检查。我将预先设置的用户名/密码附加到请求头中,然后对照API中的设置进行检查。我只关心密码,但我使用用户名来识别来源。我创建了一个基本控制器,我的所有API控制器都从该控制器继承,因此我可以授权所有请求。(日志记录是可选的)

然后在调用API的代码中,我将用户名密码编码到authorization属性中

var client = new HttpClient
{
    BaseAddress = new Uri(ConfigurationManager.AppSettings["ReportApiUri"])
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Authorization =
       new AuthenticationHeaderValue("Basic",
       Convert.ToBase64String(Encoding.UTF8.GetBytes(
           $"SourceApplication:{ConfigurationManager.AppSettings["ApiPassword"]}"
           )
       ));
如果您是从SPA打电话,您可以预加密这些值并将其传入。我可以通过邮递员来传递,所以必须有一种方法可以通过我认为的任何客户来传递


PS-我的基本控制器中的AppConfig对象只是我为检索设置而编写的一个类,您可以使用configuration manager甚至硬编码。。我的意思是,我不建议长期对其进行硬编码,而只是对其进行测试。

这里有一个关于另一个堆栈溢出的问题(问题得到了回答),其中有人试图获取客户端IP。

绑定到IP或网站的API密钥(如谷歌所做的)?是否继续使用API密钥,通过SSL连接到您的API?忽略任何不提供密钥的呼叫?@VDWWD我是jus
var client = new HttpClient
{
    BaseAddress = new Uri(ConfigurationManager.AppSettings["ReportApiUri"])
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Authorization =
       new AuthenticationHeaderValue("Basic",
       Convert.ToBase64String(Encoding.UTF8.GetBytes(
           $"SourceApplication:{ConfigurationManager.AppSettings["ApiPassword"]}"
           )
       ));